2016-05-30 62 views
0

假设,我创建了一个包含许多函数和其他东西的python文件(FirstFile.py)名称。其中一个功能是这个(当然,它是简化的):如何使用另一个文件中定义的变量在文件中使用包含eval的函数?

def func(string): 
    assert eval(string) 

此外,我已经创建了从文件进口FUNC()上述的Python文件。然后第二个Python文件尝试执行以下过程:

from FirstFile import func 
amk = 1 
func("amk == 1") 

当变量“AMK”是第一个文件,没有问题的揭示。然而,当变量“AMK”是第二个文件,这是在这里说明,错误显示:

NameError: name 'amk' is not defined 

你想请你帮我解决这个问题?

+0

它是'amk'还是'ask',因为你的错误显示'ask',但是无论哪种方式,变量都在第二个文件的范围内,第一个文件不能访问。为了给予第一个文件访问权限,我将它作为一个变量传递给func()。 func被定义为'def func(string,* args):' – TheLazyScripter

+0

@TheLazyScripter它不能与'def func(string,* args)'一起工作。 – Luis

+0

@Kivi Kivit你能详细说明你需要执行什么吗?如果需要,可以通过某种方式解决变量范围的问题... – Luis

回答

0

默认eval执行当前的局部/全局范围,如果要指定一个不同的环境中,你可以这样做:

eval("x == 1", {"x":1}) 

所以你的功能可能需要一个可选environ参数:

def func(string, environ=None): 
    assert eval(string, environ) 

那么你可以从通过locals()的环境中的其他模块调用函数

作为一个便笺,我建议不要评估任意代码,特别是如果它来自另一个源/模块,因为它可能会意外地包含有害代码。

+0

'func'中的'if'语句不是必需的。将'None'作为全局参数传递给'eval'也会起作用。 –

+0

所以你是对的,我不确定,并知道有没有其他内置的功能,抱怨时给予无。 –

+0

另外,根据问题作者的具体问题,通过全局变量和本地变量也许是有意义的。但是,如果'func'不是从模块级调用的,它只会有所不同。 –

相关问题