Каким может быть использование SymbolType в Python?
Вот пакет 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 ответ
Символы не являются заменой для строк. Хотя оба представлены последовательностью символов, символ не должен использоваться вместо строки, когда это является доминирующим свойством. Символы представляют собой уникальную личность. Это означает, что для их сравнения можно использовать равенство указателей (а не равенство содержимого). По этой причине символы часто используются в качестве констант, элементов перечисления, ключей хеш-таблицы или идентификаторов (в lisp).
В Лиспе, когда вы впервые ссылаетесь на символ, создается соответствующая запись в таблице символов. Если после этого на один и тот же символ будет ссылаться, он будет найден и будет представлять то же значение.
Я не программист на Python, но поскольку символы не встроены в язык Python, их использование может быть ограничено или не очень удобно. Вы не должны использовать их для изоляции строк. Используйте для этого класс-оболочку.
Редактировать: читая документы SymbolType, я увидел, что они связывают исходное пространство имен (через __name__
). Common Lisp тоже это делает. Можно было бы использовать это средство каким-то образом.
Также прочитайте этот вопрос.