在Python中读取bin()函数的定义,官方文档(3.4)说,bin()返回的二进制字符串是一个有效的Python表达式。
这让我想知道:函数能否返回无效的Python表达式?什么是有效/无效的Python表达式的定义究竟是什么?
答案 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中二进制数的有效字符串表示形式。