我在装饰器中有这个代码:
is_local_valid = ['system_id', 'server_id', 'sensor_id']
local_params = [x for x in is_local_valid if x in kwargs.keys() and kwargs[x].lower() is 'local'] + [y for y in args if y.lower() is 'local']
if local_params == []:
raise AssertionError("Tried to access the database from a non connected profile")
我注意到,用于比较两个字符串的is
中缀运算符在这种情况下返回False,即使kwargs[x].lower()
等于local
也是如此。但==
运算符确实返回True。当然,两者都是str
。
有关进展情况的任何线索?
答案 0 :(得分:3)
操作员是和不测试对象身份:
当且仅当x和y是同一个对象时,x才是真的。 x不是y产生反向真值。
>>> id('local')
42745112
>>> a = {1: 'locAl'}
>>> id(a[1].lower())
53363408
它们不是同一个对象
答案 1 :(得分:0)
a is b
确定两个名称a
和b
是否引用同一个对象(即id(a) == id(b)
)。 a == b
确定他们是否具有相等的值。将字符串与is
进行比较并不是一个好主意。改为使用==
:
>>> "".join("hello")
'hello'
>>> "hello" is "".join("hello")
False
>>> "hello" == "".join("hello")
True
与is
进行比较的唯一一般情况是None
,例如:
if a is None: