Python 什么';嵌套函数的名称是什么?为什么';是否查看嵌套函数?

Python 什么';嵌套函数的名称是什么?为什么';是否查看嵌套函数?,python,scope,namespaces,eval,Python,Scope,Namespaces,Eval,当我尝试运行此代码时,出现以下错误。我试图用函数指针初始化一个列表。看起来eval没有看到函数。我猜有一些我不理解的范围界定。正如您所看到的,当我手工创建表格时,它会起作用。我试图避免维护函数列表。当我将函数设置为全局函数时,这也起到了作用 Traceback (most recent call last): File "/home/westgate/code/python/try/x.py", line 27, in <module> main() File

当我尝试运行此代码时,出现以下错误。我试图用函数指针初始化一个列表。看起来eval没有看到函数。我猜有一些我不理解的范围界定。正如您所看到的,当我手工创建表格时,它会起作用。我试图避免维护函数列表。当我将函数设置为全局函数时,这也起到了作用

 Traceback (most recent call last):
   File "/home/westgate/code/python/try/x.py", line 27, in <module>
     main()
   File "/home/westgate/code/python/try/x.py", line 23, in main
     fxns_eval = [eval(fxn_name) for fxn_name in dir() if fxn_name.startswith('fxn_')]
   File "/home/westgate/code/python/try/x.py", line 23, in <listcomp>
     fxns_eval = [eval(fxn_name) for fxn_name in dir() if fxn_name.startswith('fxn_')]
   File "<string>", line 1, in <module>
 NameError: name 'fxn_bar' is not defined

问题是您没有显式地传递
局部变量
,因此。从:

如果两个字典都被省略,则表达式将在 调用eval()的环境

但是,环境是列表理解,它创建自己的范围,这些函数既不在列表理解的本地命名空间中,也不在全局命名空间中。您需要
main
的本地名称空间,因此请注意,这是可行的:

>>> def main():
...    def foo(): 'foo'
...    print(eval('foo'))
...
>>> main()
<function main.<locals>.foo at 0x10c3ba6a8>
事实上,这相当于根本不通过辩论

你可以做:

>>> def main():
...    def foo(): 'foo'
...    def bar(): 'bar'
...    locs, globs = locals(), globals()
...    print([eval(x, globs, locs) for x in dir()])
...
>>> main()
[<function main.<locals>.bar at 0x10bded1e0>, <function main.<locals>.foo at 0x10c3ba6a8>, {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'n1': 1014.308, 'n0': 961.06, 'p1': 18.59, 'p0': 19.65, 'q1': 1014.308, 'q0': 961.06, 'main': <function main at 0x10c3ba620>}, {'foo': <function main.<locals>.foo at 0x10c3ba6a8>, 'bar': <function main.<locals>.bar at 0x10bded1e0>, 'globs': {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'n1': 1014.308, 'n0': 961.06, 'p1': 18.59, 'p0': 19.65, 'q1': 1014.308, 'q0': 961.06, 'main': <function main at 0x10c3ba620>}, 'locs': {...}}]
>>>
>>def main():
...    def foo():“foo”
...    def bar():“bar”
...    局部变量,全局变量=局部变量(),全局变量()
...    打印([x在目录中的x的评估(x,全局,局部)])
...
>>>main()
[,{uuuuuuuuuuuuuuuuuuuuuu名称:''uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu{“uuuu名称uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
>>>

您的函数是在
main()
中定义的,因此它们是本地的。将它们放出来,它们将是全局的。我不希望它们是全局的。有没有办法使其作为嵌套函数工作?请参见“是”:将它们放在列表或元组中,并通过它而不是
dir()进行迭代
这是因为列表理解本质上创建了一个函数范围,注意,
eval('fxn\u bar')
在理解工作之外
>>> def main():
...    def foo(): 'foo'
...    def bar(): 'bar'
...    print([eval(x, globals(), locals()) for x in dir()])
...
>>> main()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in main
  File "<stdin>", line 4, in <listcomp>
  File "<string>", line 1, in <module>
NameError: name 'bar' is not defined
>>> def main():
...    def foo(): 'foo'
...    def bar(): 'bar'
...    locs, globs = locals(), globals()
...    print([eval(x, globs, locs) for x in dir()])
...
>>> main()
[<function main.<locals>.bar at 0x10bded1e0>, <function main.<locals>.foo at 0x10c3ba6a8>, {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'n1': 1014.308, 'n0': 961.06, 'p1': 18.59, 'p0': 19.65, 'q1': 1014.308, 'q0': 961.06, 'main': <function main at 0x10c3ba620>}, {'foo': <function main.<locals>.foo at 0x10c3ba6a8>, 'bar': <function main.<locals>.bar at 0x10bded1e0>, 'globs': {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'n1': 1014.308, 'n0': 961.06, 'p1': 18.59, 'p0': 19.65, 'q1': 1014.308, 'q0': 961.06, 'main': <function main at 0x10c3ba620>}, 'locs': {...}}]
>>>