tldr; 看到最后一行; 其余的只是序言.
我正在开发一个测试工具,它解析用户脚本并生成一个Python脚本然后运行它.这个想法是非技术人员能够编写高级测试脚本.
我已经介绍了变量的概念,因此用户可以LET在他的脚本中使用该关键字.例如LET X = 42,我只是扩展到X = 42.然后他们可以在脚本中使用X - RELEASE CONNECTION X
但如果有人写道LET 2 = 3呢?这会产生无效的Python.
如果我X在变量中有这个variableName,那么我如何检查是否variableName是一个有效的Python变量?
mha*_*wke 33
在Python 3中,您可以使用它str.isidentifier()来测试给定字符串是否是有效的Python标识符/名称.
>>> 'X'.isidentifier()
True
>>> 'X123'.isidentifier()
True
>>> '2'.isidentifier()
False
>>> 'while'.isidentifier()
True
Run Code Online (Sandbox Code Playgroud)
最后一个示例显示您还应检查变量名称是否与Python关键字冲突:
>>> from keyword import iskeyword
>>> iskeyword('X')
False
>>> iskeyword('while')
True
Run Code Online (Sandbox Code Playgroud)
所以你可以把它放在一个函数中:
from keyword import iskeyword
def is_valid_variable_name(name):
return name.isidentifier() and not iskeyword(name)
Run Code Online (Sandbox Code Playgroud)
另一个在Python 2和3中工作的选项是使用该ast模块:
from ast import parse
def is_valid_variable_name(name):
try:
parse('{} = None'.format(name))
return True
except SyntaxError, ValueError, TypeError:
return False
>>> is_valid_variable_name('X')
True
>>> is_valid_variable_name('123')
False
>>> is_valid_variable_name('for')
False
>>> is_valid_variable_name('')
False
>>> is_valid_variable_name(42)
False
Run Code Online (Sandbox Code Playgroud)
这将解析赋值语句而不实际执行它.它将获取无效标识符以及尝试分配给关键字.在上面的代码中None是一个分配给给定名称的任意值 - 它可以是RHS的任何有效表达式.