鍍金池/ 問答/Python  網(wǎng)絡(luò)安全/ python函數(shù)中使用eval的疑惑?

python函數(shù)中使用eval的疑惑?

問題如下:

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

這是為什么呢?

回答
編輯回答
落殤

跟名字空間有關(guān), eval() 官方文檔是這樣的:

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

其中有:

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

兩個(gè)可選屬性.如果這兩個(gè)都不寫, eval 默認(rèn)只能識別標(biāo)準(zhǔn)的 builtins 模塊.

你定義的 f() 函數(shù)的局部名字空間不包含實(shí)例 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')
2017年1月27日 04:28
編輯回答
笨笨噠
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')
2017年9月19日 12:56