[英]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.