开发者

why my "eval" function doesn't work ,i think it can be print 'b',but not

a='''b="ddd"'''
eval(repr(a))
print str(a)
print b

Please try to use the code, rather than text, because my English is 开发者_如何学编程not very good, thank you


Use:

eval(compile(a,'<string>','exec'))

instead of:

eval(repr(a))

Transcript:

>>> a='''b="ddd"'''
>>> eval(compile(a,'<string>','exec'))
>>> print str(a)
b="ddd"
>>> print b
ddd

The problem is that you're actually executing the statement 'b="ddd"' which is not an assignment to b but an evaluation of the string.

The eval() built-in, when given a string, evaluates it as an expression (not a statement) and returns the result. You can get eval() to run non-expression code by giving it a code object, which we create with compile() above. In that case it runs the code and returns None.

You can see a similar effect if you just enter:

>>> 'c=7'
'c=7'
>>> c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'c' is not defined
>>> c=7
>>> c
7
>>> '7=d'
'7=d'
>>> 7=d
  File "<stdin>", line 1
SyntaxError: can't assign to literal

Clearly 7=d is not valid Python, yet '7=d' is, for the reason explained above.

Descriptions of the expr(), repr() and compile() built-ins, adequate enough to work this out, were found here. No built-ins were harmed during the making of this answer.


eval is used to evaluate (get the result of) an expression. What you want is dynamic execution of Python code, which is done with exec:

>>> a='''b="ddd"'''
>>> exec(a)
>>> print b
ddd

Also note that you should not call repr() before passing the string to either function. You already have a string, calling repr() creates a string representation of a string.


Reconsider whether you really need to use eval(). For example, you can use globals() like this:

>>> globals()['b'] = 'ddd'
>>> print b
ddd

But perhaps what you should probably be using is just a dictionary:

>>> my_namespace = dict()
>>> my_namespace['b'] = 'ddd'
>>> my_namespace
{'b': 'ddd'}
>>> print my_namespace['b']
ddd
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜