将用户输入解析为函数以从另一个文件中获取
Parse a user input to a function to fetch from another file
所以我有 2 个文件,file1.py 和 file2.py
我有几个列表 sam 和 dan 来自 file2.py
所以当我从 file1.py 尝试这个时,我得到
AttributeError: 'module' object has no attribute 'myvar'
file1.py
import file2
f_var=[]
myvar = raw_input("some string")
if myvar == "sam":
f_var = loopbov("sam")
def loopbov(myvar):
lst=[]
for each in file2.myvar:
te = fet(each):
lst.append(te)
return lst
def fet(vpf):
tmp=[]
# this gets me an list as an output
return tmp
file2.py
sam=["33:89","21:70"]
dan=["34:43","23:56"]
我知道这是一个简单的错误,但有人可以解释如何通过在此处解析对象以从另一个文件访问来访问
在file2.py
中使用字典:
my_vars = {'sam': ["33:89","21:70"],
'dan': ["34:43","23:56"]}
现在,在file1.py
:
import file2
def loopbov(myvar):
lst=[]
for each in file2.my_vars[myvar]:
te = fet(each)
lst.append(te)
return lst
def fet(vpf):
tmp=[]
# this gets me an list as an output
return tmp
f_var = loopbov("sam")
所以,在file2.py
中定义了两个变量,对吧? sam
和 dan
.
你可以看到利用比Python,一切都是对象:
import file2
print("This is what I found in file2:\n%s" % vars(file2))
您会看到很多东西,但除此之外,您还会看到 sam
和 dan
变量。没有myvar
名字吧?在您的问题中,file1.py
的 myvar
将包含 您要访问的变量的名称...
这就是 getattr
的用武之地:给定一个实例,如果知道其名称(如果名称存储在字符串中),如何获取其字段之一。像这样:getattr(file2, myvar)
所以你的 loopbov
函数,你在 myvar
参数中传递要迭代的列表的名称将变成:
def loopbov(myvar):
lst=[]
for each in getattr(file2, myvar):
# myvar will be the string `"sam"`
te = fet(each):
lst.append(te)
return lst
正如@MadPhysicist 在他的评论中提到的,可能值得一提的是 getattr
在尝试按名称获取未定义的属性时将执行的操作:您将收到 AttributeError
异常。尝试一下。在你的某处放置 file1.py
这个代码: getattr(file2, "foobar")
然而!如果您查看 getattr
的文档,您会看到它接受一个可选参数:default
。可以这样读 "ok, if I don't find the attribute, I won't give you an error, but that default
argument".
如果您对该主题感兴趣,可能还值得一读,了解导入的工作原理和它创建的命名空间(参见 this and this)
所以我有 2 个文件,file1.py 和 file2.py
我有几个列表 sam 和 dan 来自 file2.py
所以当我从 file1.py 尝试这个时,我得到
AttributeError: 'module' object has no attribute 'myvar'
file1.py
import file2
f_var=[]
myvar = raw_input("some string")
if myvar == "sam":
f_var = loopbov("sam")
def loopbov(myvar):
lst=[]
for each in file2.myvar:
te = fet(each):
lst.append(te)
return lst
def fet(vpf):
tmp=[]
# this gets me an list as an output
return tmp
file2.py
sam=["33:89","21:70"]
dan=["34:43","23:56"]
我知道这是一个简单的错误,但有人可以解释如何通过在此处解析对象以从另一个文件访问来访问
在file2.py
中使用字典:
my_vars = {'sam': ["33:89","21:70"],
'dan': ["34:43","23:56"]}
现在,在file1.py
:
import file2
def loopbov(myvar):
lst=[]
for each in file2.my_vars[myvar]:
te = fet(each)
lst.append(te)
return lst
def fet(vpf):
tmp=[]
# this gets me an list as an output
return tmp
f_var = loopbov("sam")
所以,在file2.py
中定义了两个变量,对吧? sam
和 dan
.
你可以看到利用比Python,一切都是对象:
import file2
print("This is what I found in file2:\n%s" % vars(file2))
您会看到很多东西,但除此之外,您还会看到 sam
和 dan
变量。没有myvar
名字吧?在您的问题中,file1.py
的 myvar
将包含 您要访问的变量的名称...
这就是 getattr
的用武之地:给定一个实例,如果知道其名称(如果名称存储在字符串中),如何获取其字段之一。像这样:getattr(file2, myvar)
所以你的 loopbov
函数,你在 myvar
参数中传递要迭代的列表的名称将变成:
def loopbov(myvar):
lst=[]
for each in getattr(file2, myvar):
# myvar will be the string `"sam"`
te = fet(each):
lst.append(te)
return lst
正如@MadPhysicist 在他的评论中提到的,可能值得一提的是 getattr
在尝试按名称获取未定义的属性时将执行的操作:您将收到 AttributeError
异常。尝试一下。在你的某处放置 file1.py
这个代码: getattr(file2, "foobar")
然而!如果您查看 getattr
的文档,您会看到它接受一个可选参数:default
。可以这样读 "ok, if I don't find the attribute, I won't give you an error, but that default
argument".
如果您对该主题感兴趣,可能还值得一读,了解导入的工作原理和它创建的命名空间(参见 this and this)