python函数中使用eval的疑惑?

发布于 2022-09-06 10:39:22 字数 326 浏览 28 评论 0

问题如下:

class A:
    ...
    
o = A()
o.a = 0

def f(o,a):
    print(eval(o+'.'+a))

f('o','a') # AttributeError: 'str' object has no attribute 'a'

但是:

class A:
    ...
    
o = A()
o.a = 0

print(eval('o'+'.'+'a')) # 0

这是为什么呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

予囚 2022-09-13 10:39:22

跟名字空间有关, eval() 官方文档是这样的:

eval(expression, globals=None, locals=None)

其中有:

  • globals: 全局名字空间
  • locals: 局部名字空间

两个可选属性.如果这两个都不写, eval 默认只能识别标准的 builtins 模块.

你定义的 f() 函数的局部名字空间不包含实例 o:

class A:
    def __init__(self):
        self.a = 10

o = A()
o.a    # 10

def f(o, a):
    print(eval(o + '.' + a, globals())

f('o', 'a')
佞臣 2022-09-13 10:39:22
class A:
    ...
o=A()
o.a=0
def f(o1,a1):
    print(eval(o1+'.'+a1))
# AttributeError: 'str' object has no attribute 'a'
f('o','a')
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文