gpt4 book ai didi

python - "library"方法的范围

转载 作者:行者123 更新时间:2023-11-28 22:07:08 25 4
gpt4 key购买 nike

我显然对 Python 作用域的理解很差。或许您可以提供帮助。

背景:
我正在使用

if __name__ == "__main__"

构造以在我的模块中执行“ self 测试”。每个自测试都会调用各种公共(public)方法并打印它们的结果,以便在我开发模块时进行目视检查。

为了让事情变得“简单”和易于管理,我创建了一个小方法来简化方法调用的测试:

def pprint_vars(var_in):
print("%s = '%s'" % (var_in, eval(var_in)))

什么时候

foo = "bar"

通过以下方式调用 pprint_vars:

pprint_vars('foo')

打印:

foo = 'bar'

一切都很好。

问题陈述:
不高兴只是 KISS,我费了九牛二虎之力将我方便的“pprint_vars”方法移动到一个名为“debug_tools.py”的单独文件中,并在我想访问“pprint_vars”时简单地导入“debug_tools”。

这就是事情分崩离析的地方。我希望

import debug_tools

foo = bar
debug_tools.pprint_vars('foo')

继续发挥它的魔力并打印:

foo = 'bar'

相反,它用以下方式问候我:

NameError: name 'some_var' is not defined

非理性的信念:
我相信(显然是错误的)import 将导入的方法(或多或少)与代码“内联”,因此变量作用域规则将与内联定义的方法保持相似。

请求帮助:
有人可以纠正我对进口范围界定的(错误)理解吗?

谢谢,JS

最佳答案

在 python 中,每个文件都是它自己的命名空间。函数在被调用时按以下顺序解析其变量:

  1. 局部变量(包括捕获的变量或在闭包中)
  2. (模块)全局变量
  3. 内置

您可以使用(特定于解释器的)inspect 模块将调用堆栈导航为帧列表。由于一个框架知道它的局部变量、全局变量、内置函数和父框架,您可以像这样通过调用者的眼睛“看到”解释器(请仅用于调试):

import inspect
def log_var(name):
f = inspect.currentframe().f_back
if name in f.f_locals:
print "local `%s` = %r" % (name, f.f_locals[name])
elif name in f.f_globals:
print "global `%s` = %r" % (name, f.f_globals[name])
elif name in f.f_builtins:
print "builtin `%s` = %r" % (name, f.f_builtins[name])
else:
print "`%s` not found" % name

关于python - "library"方法的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2596610/

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