Python字符串函数isidentifier()

Python字符串函数isidentifier(),python,string,Python,String,我正在阅读Python3的一本书,遇到了字符串函数isidentifier()。文本描述为“s.isidentifier():如果s为非空且为有效标识符,则返回True”。我在Python Shell中进行了如下测试: >>> s = 'test' >>> s.isidentifier() True >>> 'blah'.isidentifier() True 我希望第二条语句返回false,因为“blah”不在变量中。有人能解释一下吗?谢

我正在阅读Python3的一本书,遇到了字符串函数isidentifier()。文本描述为“s.isidentifier():如果s为非空且为有效标识符,则返回True”。我在Python Shell中进行了如下测试:

>>> s = 'test'
>>> s.isidentifier()
True
>>> 'blah'.isidentifier()
True
我希望第二条语句返回false,因为“blah”不在变量中。有人能解释一下吗?谢谢

如果s为非空且是有效的标识符,则返回True

它们的意思是s可以作为有效的标识符。这并不意味着它是一个正在使用的标识符

您的第一个示例显示了相同的内容:“test”(isidentifier实际检查的内容)也不是变量的名称。我想你是说

>>> 's'.isidentifier()
True
“isidentifier”没有说明被测试字符串引用的“变量”。所以

'blah'.isidentifier()
与相同

s = 'blah'
s.isidentifier()
在Python中,它从不(或很少)涉及“变量”(Python没有变量),而是关于对象。在本例中,字符串。

Python没有“变量”。从对象的角度思考会更有帮助

'blah'
'blah'时肯定存在。isidentifier()
被调用(毕竟它意味着“调用字符串对象的方法
'blah'
”)

因此,如果您的理解是正确的,
isidentifier()
字符串对象的方法应该总是返回
True
,因为在调用时,对象肯定存在

isidentifier()
所做的是检查string对象是否可用作有效标识符。在Python会话中尝试以下两行,例如:

>>> a = "$"
>>> "$".isidentifier()

即使将
“$”
分配给名称
a
,调用
isidentifier()
也会返回
False
,因为
$
在Python中不是有效的标识符。

isidentifier
是一个Python函数,它只测试字符串是否只包含某些字符(下划线、数字和字母)并以alpha或下划线开头,因此该字符串可用于有效的Python标识符。测试字符类的其他函数有
isalpha
isalnum
isdigit

ss = (
    'varABC123',
    '123ABCvar',
    '_123ABCvar',
    'var_ABC_123',
    'var-ABC-123',
    'var.ABC.123',
    # check your own strings
)

fmt = '%-15s%-10s%-10s%-10s%-10s' 
print(fmt % ('', 'isalpha', 'isalnum', 'isdigit', 'isidentifier'))
for s in ss:
    print(fmt % (s, s.isalpha(), s.isalnum(), s.isdigit(), s.isidentifier()))
结果:

               isalpha   isalnum   isdigit   isidentifier
varABC123      False     True      False     True      
123ABCvar      False     True      False     False     
_123ABCvar     False     False     False     True      
var_ABC_123    False     False     False     True      
var-ABC-123    False     False     False     False     
var.ABC.123    False     False     False     False     

要写出rosscj2533所认为的,我想你可以先做isidentifier(),然后做eval(),看看它是否给你一个NameError。啊,我认为它是当前正在使用的有效标识符。谢谢。@matrixprog-最好在locals()和globals()中测试这个标识符的存在性,而不是求值()。更快更安全。