pythonical检查变量名是否有效

2024-05-20 14:37:25 发布

您现在位置:Python中文网/ 问答频道 /正文

最后一行,其余的只是前言。


我正在开发一个测试工具,它解析用户脚本并生成一个Python脚本,然后运行该脚本。这个想法是让非技术人员能够编写高级测试脚本。

我已经介绍了变量的概念,因此用户可以在脚本中使用LET关键字。E、 g.LET X = 42,我简单地扩展到X = 42。之后,他们可以在脚本中使用X-RELEASE CONNECTION X

但是如果有人写LET 2 = 3呢?这将生成无效的Python。

如果变量variableName中有这个X,那么如何检查variableName是否是有效的Python变量?


Tags: 用户脚本概念release测试工具关键字connectionlet
3条回答

您可以尝试一个测试赋值,看看它是否引发一个SyntaxError

>>> 2fg = 5
  File "<stdin>", line 1
    2fg = 5
      ^
SyntaxError: invalid syntax

在Python 3中,可以使用^{}来测试给定的字符串是否是有效的Python标识符/名称。

>>> 'X'.isidentifier()
True
>>> 'X123'.isidentifier()
True
>>> '2'.isidentifier()
False
>>> 'while'.isidentifier()
True

最后一个示例显示,还应检查变量名是否与Python关键字冲突:

>>> from keyword import iskeyword
>>> iskeyword('X')
False
>>> iskeyword('while')
True

所以你可以把它放在一个函数中:

from keyword import iskeyword

def is_valid_variable_name(name):
    return name.isidentifier() and not iskeyword(name)

在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

这将解析赋值语句,而不实际执行它。它将获取无效的标识符以及分配给关键字的尝试。在上面的代码中,None是要分配给给定名称的任意值-它可以是RHS的任何有效表达式。

您可以使用异常处理并实际捕获NameErrorSyntaxError。在try/except块中测试它,并通知用户是否有一些无效的输入。

相关问题 更多 >