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

时间:2018-01-04 21:50:25

标签: python python-2.x

所以我有2个文件,file1.py和file2.py

我有一些来自file2.py

的名单sam和dan

所以当我从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"]

我知道这是一个简单的错误,但有人可以解释如何通过解析这里的对象来访问另一个文件

2 个答案:

答案 0 :(得分:2)

所以,在file2.py中定义了两个变量,对吧? samdan

你可以看到,比Python更有优势,一切都是对象:

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

您会看到一些东西,但除此之外,您还会看到samdan个变量。没有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会做什么:你会得到一个{ {1}}例外。试试吧。放在AttributeError此代码的某处:file1.py但是!如果您看到getattr(file2, "foobar")的文档,您会看到接受可选参数:getattr。这可以像"那样读取,如果我找不到该属性,我不会给你一个错误,但default参数"

如果您对该主题感兴趣,关于导入的工作方式及其创建的命名空间(参见thisthis),也可能值得一读。

答案 1 :(得分:0)

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")