[英]Proper way of having a unique identifier in Python?
基本上,我有一个列表,如: [START, 'foo', 'bar', 'spam', eggs', END]
,START / END标识符是稍后需要的,所以我可以稍后进行比较。 现在,我把它设置成这样:
START = object()
END = object()
这样可以正常工作,但是它遇到了不能使用酸洗的问题。 我试过以下方式做到这一点,但它似乎是一种实现这个目的的可怕方法:
class START(object):pass
class END(object):pass
任何人都可以分享更好的方法吗? 另外,我上面建立的例子只是对另一个问题的过度简化。
如果你想要一个保证唯一的对象, 并且还可以保证恢复到完全相同的标识,如果正确的pickle和unpickled,顶级函数,类,类实例,如果你关心的is
而不是==
列表(和其他变量),都很好。 即,任何:
# work for == as well as is
class START(object): pass
def START(): pass
class Whatever(object): pass
START = Whatever()
# if you don't care for "accidental" == and only check with `is`
START = []
START = {}
START = set()
这些都不是可怕的,没有有什么特别的优势(如果你关心取决于==
或仅仅is
)。 也许def
的通用性,简洁性和更轻的重量的力胜。
您可以定义一个Symbol
类来处理START和END。
class Symbol:
def __init__(self, value):
self.value = value
def __eq__(self, other):
return isinstance(other, Symbol) and other.value == self.value
def __repr__(self):
return "<sym: %r>" % self.value
def __str__(self):
return str(self.value)
START = Symbol("START")
END = Symbol("END")
# test pickle
import pickle
assert START == pickle.loads(pickle.dumps(START))
assert END == pickle.loads(pickle.dumps(END))
如果你的列表没有字符串,我只使用“start”,“end”,因为Python由于实习而进行比较O(1)。
如果你确实需要字符串,而不是元组,那么完整的cheapskate方法是:
[("START",), 'foo', 'bar', 'spam', eggs', ("END",)]
PS:我确定你的名单是之前的数字,而不是字符串,但我看不到任何修改,所以我必须想象它
实际上,我喜欢你的解决方案。
前段时间我正在攻击Python模块,我希望有一个特殊的魔法值,这在其他任何地方都无法出现。 我花了一些时间思考它,我想出的最好的是你使用的相同技巧:声明一个类,并使用类对象作为特殊的魔法值。
当你检查哨兵时,你当然应该使用is
运算符来获取对象标识:
for x in my_list:
if x is START:
# handle start of list
elif x is END:
# handle end of list
else:
# handle item from list
我想如果你更明确地说明你需要什么,这可能会更容易回答,但是如果遇到像这样的问题我会倾向于:
>>> START = os.urandom(16).encode('hex')
>>> END = os.urandom(16).encode('hex')
正如我所见,这种方法的优点
object()
或空类的情况。 缺点(?)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.