繁体   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