Каким может быть использование SymbolType в Python? - PullRequest
2 голосов
/ 26 июня 2010

Вот пакет SymbolType , который добавляет символы в Python.Могут ли те, кто сделал что-нибудь полезное с Lisp / Scheme, сказать мне, как я могу использовать этот тип в Python?

Можно ли его использовать для изоляции строк, поступающих извне (из Интернета), от внутреннего кода?

$ sudo easy_install SymbolType
$ ipython

К сожалению, вы не можете использовать символы для передачи значений в виде kwargs:

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 голосов
/ 01 июля 2010

Символы не являются заменой для строк.Хотя оба представлены последовательностью символов, символ не должен использоваться вместо строки, если это свойство является доминирующим.Символы представляют собой уникальную личность.Это означает, что для их сравнения можно использовать равенство указателей (а не равенство содержимого).По этой причине символы часто используются в качестве констант, элементов перечисления, ключей или идентификаторов хеш-таблицы (в lisp).

В Лиспе, когда вы впервые ссылаетесь на символ, создается соответствующая запись в таблице символов.Если после этого на этот символ будет ссылаться, он будет найден и будет представлять то же значение.

Я не программист на Python, но поскольку символы не встроены в язык Python, их использование может быть ограниченоне очень удобно.Вы не должны использовать их для изоляции строк.Для этого используйте класс-оболочку.

Редактировать: читая документы SymbolType, я увидел, что они связывают исходное пространство имен (через __name__).Common Lisp тоже это делает.Можно было бы использовать это средство каким-то образом.

Также прочитайте этот вопрос .

...