【问题标题】:Non-string "Symbol" object in python?python中的非字符串“符号”对象?
【发布时间】:2018-12-08 11:17:29
【问题描述】:

当不能使用字符串时,Python 是否有用于表示符号值的内置类型?

我自己的快速实现看起来像

class Symbol:
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return self.name

用例

当一个值(比如关键字参数或列表条目)需要初始化为一个表明它没有被显式设置的值时,这些符号很有用。

如果值对允许的类型有限制,通常会使用None 或一些字符串,但如果允许 any 值,则需要一些其他唯一对象。我常用的方法是使用分配给某个私有变量的object(),但由于提供了有意义的打印表示,符号模式更便于调试。

作为替代方案,可以使用例如一个元组 ('default value',) 并将其与 is 运算符进行比较,但这不起作用,例如用于字典键。

虽然该模式很简单,可以复制/粘贴到我正在编写的每个 shell 脚本中,但具有既定行为的内置解决方案会更好。

非内置

我知道,有些包提供符号类型。一个明显的符号类型是sympi,还有https://pypi.org/project/SymbolType/。但是,添加依赖项来避免 5 行模式似乎有点过头了,因此我对 builtin 类型提出了疑问。

【问题讨论】:

  • 我认为为此目的引入一个新的标准值(比如Undef)在逻辑上是不可能的。然后,我们需要区分“除 Undef 之外的任何值”(以前称为“任何值”)和“包括 Undef 的任何值”。
  • 我不是要引入一个新的标准值;相反,我希望能够轻松定义我自己的私有的,例如_EMPTY=Symbol('_EMPTY') 现在我会做不太方便的_EMPTY=object()
  • 也许是collections.UserString("_EMPTY")。与常规字符串不同,UserString('foo')UserString('foo') 计算结果为 False。
  • @VPfB 似乎适用于许多用例,但与object() 或我的简单Symbol 实现不同,它不适用于字典,因为它们通过== 语义进行比较。

标签: python symbols


【解决方案1】:

您可以使用枚举库: https://docs.python.org/3/library/enum.html

【讨论】:

  • 可以作为后备使用,但会引入不必要的类并误导语义。我的符号模式将表示“这些是私有的、没有特定关系的单例对象”,而(ab)使用枚举将表示“这些是私有的、单例对象,并且它们在某种程度上是相关的。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 2013-08-17
相关资源
最近更新 更多