gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:41:46 25 4
gpt4 key购买 nike

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

这让我想知道:函数可以返回无效的 Python 表达式吗?有效/无效 Python 表达式的定义到底是什么?

最佳答案

函数返回表达式。它们返回。文档所说的是,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'

关于python - Python 中的函数可以返回无效的 Python 表达式吗?有效/无效 Python 表达式的定义究竟是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29522424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com