用Python来检查变量名是否有效

Maw*_*awg 13 python

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的任何有效表达式.

  • 对于它的价值,`is_valid_variable_name('a = b')`,`is_valid_variable_name('[]')`,`is_valid_variable_name('*a')`将全部返回'True`. (3认同)