【发布时间】: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实现不同,它不适用于字典,因为它们通过==语义进行比较。