gpt4 book ai didi

python - python中导入类的范围是什么?

转载 作者:行者123 更新时间:2023-12-04 07:12:21 25 4
gpt4 key购买 nike

请原谅模糊的标题。如果有人有建议,请告诉我!也请用更合适的标签重新标记!

问题

我想让一个导入类的实例能够查看导入器范围(全局、本地)内的东西。由于我不确定这里工作的确切机制,我可以用片段而不是文字来更好地描述它。

## File 1
def f1(): print "go f1!"

class C1(object):
def do_eval(self,x): # maybe this should be do_evil, given what happens
print "evaling"
eval(x)
eval(x,globals(),locals())

然后从一个迭代 session 中运行这段代码,会有很多 NameErrors
## interactive
class C2(object):
def do_eval(self,x): # maybe this should be do_evil, given what happens
print "evaling"
eval(x)
eval(x,globals(),locals())

def f2():
print "go f2!"

from file1 import C1
import file1

C1().do_eval('file1.f1()')
C1().do_eval('f1()')
C1().do_eval('f2()')

file1.C1().do_eval('file1.f1()')
file1.C1().do_eval('f1()')
file1.C1().do_eval('f2()')

C2().do_eval('f2()')
C2().do_eval('file1.f1()')
C2().do_eval('f1()')

这类任务是否有共同的习语/模式?我是不是完全找错树了?

最佳答案

在这个例子中,你可以简单地将函数作为对象传递给 C1 中的方法。 :

>>> class C1(object):
>>> def eval(self, x):
>>> x()
>>>
>>> def f2(): print "go f2"
>>> c = C1()
>>> c.eval(f2)
go f2

在 Python 中,您可以将函数和类传递给其他方法并在那里调用/创建它们。

如果你想实际评估一个代码字符串,你必须指定环境,正如 Thomas 已经提到的那样。

您的模块从上面略有改变:
## File 1
def f1(): print "go f1!"

class C1(object):
def do_eval(self, x, e_globals = globals(), e_locals = locals()):
eval(x, e_globals, e_locals)

现在,在交互式解释器中:
>>> def f2():
>>> print "go f2!"
>>> from file1 import * # 1
>>> C1().do_eval("f2()") # 2
NameError: name 'f2' is not defined

>>> C1().do_eval("f2()", globals(), locals()) #3
go f2!
>>> C1().do_eval("f1()", globals(), locals()) #4
go f1!

一些注释
  • 在这里,我们插入来自 file1 的所有对象进入这个模块的命名空间
  • f2不在 file1 的命名空间中,因此我们得到 NameError
  • 现在我们显式传递环境,代码可以评估
  • f1在这个模块的命名空间中,因为我们导入了它

  • 编辑 : 添加了关于如何显式传递 eval 环境的代码示例.

    关于python - python中导入类的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/117127/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com