SymbolType在Python中的用途是什么?
这里有一个叫做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也是这样做的。也许可以以某种方式使用这个功能。
另外,可以看看这个问题。