6

基本上,我有一个类似的列表:[START, 'foo', 'bar', 'spam', eggs', END]START/END 标识符对于以后是必需的,因此我可以稍后进行比较。现在,我的设置是这样的:

START = object()
END = object()

这很好用,但它会遇到无法使用酸洗的问题。我尝试按以下方式进行操作,但这似乎是一种糟糕的方法:

class START(object):pass
class END(object):pass

有人可以分享更好的方法吗?此外,我在上面设置的示例只是对不同问题的过度简化。

4

5 回答 5

10

如果您想要一个保证唯一的对象,并且还可以保证恢复到完全相同的标识(如果腌制和未腌制),顶级函数,类,类实例,以及如果您关心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凭借通用性、简洁性和更轻的重量而获胜。

于 2009-11-05T01:23:09.060 回答
2

您可以定义一个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))
于 2009-11-05T07:39:41.670 回答
1

如果您的列表没有字符串,我将使用“start”、“end”,因为 Python 由于实习而进行比较 O(1)。

如果您确实需要字符串,但不需要元组,那么完整的cheapskate 方法是:

[("START",), 'foo', 'bar', 'spam', eggs', ("END",)]

PS:我之前确定你的列表是数字,而不是字符串,但我看不到任何修订,所以我一定是想象到的

于 2009-11-05T01:21:14.753 回答
1

事实上,我喜欢你的解决方案。

不久前,我正在研究一个 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
于 2009-11-05T01:25:40.457 回答
0

我想如果你更明确地知道你需要这个,也许这会更容易回答,但是如果遇到这样的问题,我的倾向是:

>>> START = os.urandom(16).encode('hex')
>>> END = os.urandom(16).encode('hex')

正如我所见,这种方法的优点

  • 您的标记是字符串(可以腌制或以其他方式轻松序列化,例如 JSON 或 DB,无需任何特殊努力)
  • 不太可能发生意外或故意碰撞
  • 将序列化和反序列化为相同的值,即使跨进程重新启动,(我认为)不会是object()空类的情况。

缺点(?)

  • 每次新选择它们时,它们都会完全不同。(这是好是坏取决于你没有提供的细节,我想)。
于 2009-11-05T01:20:10.657 回答