SymbolType在Python中的用途是什么?

2 投票
1 回答
540 浏览
提问于 2025-04-16 00:28

这里有一个叫做SymbolType的包,它可以在Python中添加符号。有没有用过Lisp/Scheme的人能告诉我,如何在Python中利用这种类型呢?

它能否用来把来自外部(比如网络)的字符串和内部代码隔离开来呢?

$ sudo easy_install SymbolType
$ ipython

不幸的是,你不能用符号来作为关键字参数传递值:

In [7]: X = s('X', __name__)
In [9]: a = {X: 10}
In [12]: Y = s('Y', __name__)
In [13]: a.update({Y: 20})
In [14]: a
Out[14]: {X: 10, Y: 20}

In [15]: for (k, v) in a.items():
   ....:     print k, v

Y 20
X 10

In [16]: def z(X=0,Y=1):
   ....:     print X, Y
   ....:     

In [17]: z(**a)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

...<ipython console> in <module>()

TypeError: z() keywords must be strings

1 个回答

3

符号并不是字符串的替代品。虽然它们都是由一串字符组成,但符号不应该在字符串是主要属性的情况下使用。符号代表的是一种独特的身份。这意味着我们可以用指针的相等性(而不是内容的相等性)来比较它们。因此,符号通常用作常量、枚举元素、哈希表的键或者标识符(在Lisp中)。

在Lisp中,当你第一次引用一个符号时,会在符号表中创建一个对应的条目。如果之后再引用同样的符号,它会被查找并代表相同的值。

我不是Python程序员,但因为符号并不是Python语言内置的,所以它们的使用可能会受到限制,或者不太方便。你不应该用它们来隔离字符串。可以使用一个包装类来处理这个问题。

补充:在阅读SymbolType文档时,我看到它们会捆绑原始命名空间(通过__name__)。普通Lisp也是这样做的。也许可以以某种方式使用这个功能。

另外,可以看看这个问题

撰写回答