Unicode идентификаторы в Python? - PullRequest
45 голосов
/ 16 апреля 2010

Я хочу построить функцию Python, которая вычисляет,

alt text

и хотел бы назвать мою функцию суммирования Σ. Аналогичным образом, хотел бы использовать Π для продукта и так далее. Мне было интересно, есть ли способ назвать функцию Python таким образом?

def Σ (..):
 ..
 ..

То есть, поддерживает ли Python идентификаторы юникода, и если да, может ли кто-нибудь предоставить пример для этого?

Спасибо!


Первоначальной мотивацией для этого был фрагмент кода Clojure, который я видел сегодня, который выглядит как

(defn entropy [X]
      (* -1 (Σ [i X] (* (p i) (log (p i))))))

где Σ - это макрос, определенный как

(defmacro Σ
    ... )

и я подумал, что это было круто.


Кстати, чтобы ответить на пару комментариев о читабельности - например, с большим количеством статистики / ML-кода, возможность составления операций с символами была бы действительно полезной. (Особенно для действительно сложных интегралов и др.)

φ(z) = ∫(N(x|0,1,1), -∞, z)

против

Phi(z) = integral(N(x|0,1,1), -inf, z)

или даже просто лямбда-символ для лямбды ()!

Ответы [ 5 ]

44 голосов
/ 16 апреля 2010

(я думаю, что это тоже круто, это может означать, что мы гики.)

Вы можете сделать это с кодом, который вы использовали выше в Python 3. (По крайней мере, он работает в моем интерпретаторе Python 3.1.) См .:

Но в Python 2 идентификаторы могут быть только буквами ASCII, цифрами и подчеркиванием.

16 голосов
/ 19 февраля 2014

Стоит отметить, что Python 3 поддерживает поддержку Unicode-идентификаторов, но допускает только буквы или цифры, подобные символам (см. http://docs.python.org/3.3/reference/lexical_analysis.html#identifiers для полной информации). Вот почему Σ работает (помните, что это греческая буква, а не просто математический символ), но √ нет.

14 голосов
/ 24 апреля 2015

(этот ответ является второстепенным, а не полным ответом)

Дополнительное значение для идентификаторов Unicode (о котором упоминает @ mike-desimone, и я быстро обнаружил, когда подумал, что это крутой поток и переключился на терминал, чтобы поиграть с ним), состоит в том, что множественные версии каждого глифа не эквивалентны, относительно того, как вы доберетесь до каждого глифа на каждой платформе. Например, Σ (он же греческая заглавная буква сигма, он же U + 03A3, [не могу найти метод прямого ввода Mac)] хорошо, но, к сожалению, ∑ (он же N-арное суммирование , он же U + 2211 , или opt / alt-w с использованием Mac OS X) не является допустимым идентификатором.

>>> Σ = 20
>>> Σ
20

но

>>> ∑ = 20
File "<input>", line 1
  ∑ = 20
  ^
SyntaxError: invalid character in identifier

Использование Σ специально (и, возможно, unicode-символов в целом) в качестве идентификатора может привести к очень трудным для диагностики ошибкам, если у вас есть несколько разработчиков на нескольких платформах, вносящих свой вклад в ваш код, например, отладьте это визуально:

∑ looks very similar to Σ, depending on the typeface selected

Два символа легче различить на этой странице, но в зависимости от используемого шрифта это может быть не так.

Даже трассировка не намного яснее, если Σ не напечатан рядом с ∑

  File "~/Dev/play_python33/identifiers.py", line 12
    print(∑([2, 2, 2, 2, 2]))
            ^
SyntaxError: invalid character in identifier
13 голосов
/ 23 августа 2011

Согласно это плохо , вы можете использовать некоторые символы Юникода, но не все: вы ограничены символами, обозначенными как буквы.

>>> α = 3  
>>> Σ = sum   
>>> import math  
>>> √ = math.sqrt  
  File "<stdin>", line 1  
    √ = 3  
      ^  
SyntaxError: invalid character in identifier

Кроме того: я думаю, что очень здорово иметь возможность использовать Юникод в качестве идентификаторов - и я бы хотел использовать все.

Я использую раскладку нео клавиатуры , которая дает мне греческие и математические символы на дополнительных слоях:

αβχδεφγψιθκλνοπφστ [& ωξυζ
∀⇐ℂΔ∃ΦΓΨ∫Λ⇔Σ∈ℚℝ∂⊂√∩Ξ

6 голосов
/ 16 апреля 2010

Python 2.x не поддерживает Unicode-идентификаторы и, следовательно, не поддерживает Σ в качестве идентификатора. Python 3.x поддерживает поддержку Unicode-идентификаторов, хотя многие люди получат перекрестные помехи, если им придется редактировать исходные файлы, например, с помощью идентификаторов A и Α (латинского A и греческого заглавного алфавита). Сигма часто читаема достаточно, но все же, не так читабельно, как сигма word , так зачем беспокоиться?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...