Python中的函数是否可以返回无效的Python表达式,以及有效/无效的Python表达式的定义究竟是什么?

时间:2015-04-08 18:21:48

标签: python

在Python中读取bin()函数的定义,官方文档(3.4)说,bin()返回的二进制字符串是一个有效的Python表达式。

这让我想知道:函数能否返回无效的Python表达式?什么是有效/无效的Python表达式的定义究竟是什么?

5 个答案:

答案 0 :(得分:4)

函数返回表达式。他们返回。文档中说的是{em> bin返回的值是字符串表示有效的python表达式。实际上,返回的值表示二进制文字。

您可以使用eval评估字符串是否为有效表达式:

eval(text)

警告:永远不要对您无法控制的内容(例如用户提供的字符串)调用eval,并且一般不要使用它。这是一个安全隐患。

注意:还有一个ast.literal_eval更安全(即执行时不会有任何不好,所以你可以在用户提供的文本等上使用它)但只适用于文字表达式(即没有变量/方法或函数调用的表达式。只有文字和运算符)

检查它的更好方法是使用ast.parse函数解析它:

ast.parse(text, mode='eval')

mode='eval'指定将内容解析为表达式。

这更好,因为它避免执行表达式。如果函数引发异常是因为语法无效。如果成功,则文本表示有效的python表达式:

>>> import ast
>>> ast.parse('1+', mode='eval')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.4/ast.py", line 35, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 1
    1+
     ^
SyntaxError: unexpected EOF while parsing
>>> ast.parse('1+1', mode='eval')
<_ast.Expression object at 0x7f10376c4e10>

所以你可以使用以下内容:

def is_valid_expr(expr):
    try:
        ast.parse(expr, mode='eval')
    except SyntaxError:
        return False
    else:
        return True

如:

if is_valid_expr(some_text):
    print("It's valid!")
else:
    print("It's invalid!")

正式有效表达式由python grammar定义(请参阅expr非终端)。 ast.parse函数使用该语法来解析其输入。


注意:使用ast.parse可以检查字符串是否有效python 语句或通用代码。只需将mode='single'用于单个语句,将mode='exec'用于通用代码。

答案 1 :(得分:1)

这意味着可以通过eval或直接输入结果来评估结果。例如:

>> bin(20)
'0b10100'

>>> 0b10100
20

>>> eval('0b10100')
20

通常,编程语言中的有效表达式会返回结果,而不会出现语法错误。在python中eval接受一个包含根据定义的表达式的字符串:

  

eval(表达式[,globals [,locals]])

如果表达式无效,则抛出SyntaxError

>>> eval('1+')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    1+
SyntaxError: unexpected EOF while parsing

我们必须注意,某些表达可能具有非法值但仍被视为有效,例如1 / 0

>>> eval('1/0')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

答案 2 :(得分:1)

A&#34;有效表达&#34;是一个字符串,可以是eval()&#39; d - 或ast.literal_eval()(对于文字)。


>>> bin(20)
'0b10100'

0b10100是一个有效的文字:

>>> ast.literal_eval(bin(20))
20
>>> ast.literal_eval(bin(20)) == 20
True

OTOH,b10100不是

>>> ast.literal_eval("b10100") == 20
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/sylvain/local/lib/python3.3/ast.py", line 86, in literal_eval
    return _convert(node_or_string)
  File "/home/sylvain/local/lib/python3.3/ast.py", line 85, in _convert
    raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.Name object at 0x7fdcefd9b9d0>

答案 3 :(得分:0)

在这个例子中你看到了:

>>> bin(4)
'0b100'
>>>

二进制文件以0b为前缀,表示python中二进制数的有效python表达式

答案 4 :(得分:0)

有关表达式的更多信息,请参阅What is an expression in Python?,但它只是表示它是python中二进制数的有效字符串表示形式。