簡體   English   中英

在Python中擁有唯一標識符的正確方法?

[英]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')

正如我所見,這種方法的優點

  • 您的標記是字符串(可以腌制或以其他方式輕松序列化,例如JSON或DB,無需任何特殊努力)
  • 不太可能意外或故意碰撞
  • 將序列化和反序列化為相同的值,甚至跨進程重新啟動,(我認為)不會是object()或空類的情況。

缺點(?)

  • 每次他們新選擇他們將完全不同。 (這個好壞取決於你沒有提供的細節,我想)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM