我的问题已经解决,但我想知道原因。
我的情况如下:
我将类Vector定义为:
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
创建了以下实例:
v1 = Vector(1,1)
以下代码为什么不起作用
def plus_one_A(thing):
attrs = vars(thing)
for attr_name, value in attrs.items():
if type(value) == int or type(value) == float:
eval('thing.'+ attr_name + ' += 1')
return thing
v2 = plus_one_A(v1)
thing.x += 1
^
SyntaxError: invalid syntax
但以下情况呢?
def plus_one_B(thing):
attrs = vars(thing)
for attr_name, value in attrs.items():
if type(value) == int or type(value) == float:
setattr(thing, attr_name, value + 1)
return thing
v2 = plus_one_B(v1)
难道这些代码不相同吗?
答案 0 :(得分:1)
您需要使用exec
代替eval
。 eval
只能用于expression,而不能用于statement
。
>>> eval('1 + 2')
3
>>> eval('x = 1 + 2')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
x = 1 + 2
^
SyntaxError: invalid syntax
>>>
>>> exec('x = 1 + 2')
>>> x
3
BTW,isinstance
不仅接受一个类型对象,还接受第二个参数的类型元组。
>>> isinstance(1, (int, float))
True
>>> isinstance(1.0, (int, float))
True
>>> isinstance('1', (int, float))
False