将用户输入解析为函数以从另一个文件中获取

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中定义了两个变量,对吧? samdan.

你可以看到利用比Python,一切都是对象:

import file2
print("This is what I found in file2:\n%s" % vars(file2))

您会看到很多东西,但除此之外,您还会看到 samdan 变量。没有myvar名字吧?在您的问题中,file1.pymyvar 将包含 您要访问的变量的名称...

这就是 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