Некоторые символы utf8 разрешены в источнике Python, некоторые - PullRequest
7 голосов
/ 13 августа 2010

Я заметил, что я не могу использовать все символы Юникода в моем исходном коде Python.

Хотя

def 价(何):

совершенно нормально (хотя и бессмысленно [вероятно?]),

def N(N₀, t, λ) -> 'N(t)':

это недопустимо (нулевой индекс).

Я также не могу использовать некоторые другие символы, большинство из которых я распознаю как нечто отличное от букв (например, математические операторы).Я всегда думал, что если я просто буду придерживаться правил, которые я знаю, то есть составлять имена из букв и цифр, с буквой в качестве первого символа, все будет хорошо.Теперь нулевой индекс явно является «числом».поэтому мое впечатление было неправильным.

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

Мой вопросследовательно, какие именно символы разрешены, а какие нет?И где?

Редактировать Хорошо, я, кажется, не был достаточно ясен.Я использую python3, поэтому нет необходимости декларировать кодировку исходного файла.Очевидно, с того времени я думал, что мое определение китайской функции работает.

Мой вопрос касается того, почему некоторые символы разрешены, а другие нет. Подстрочный ноль вызывает ошибку , недопустимый символ в идентификаторе, , но жирный ноль на доске работает. Оба одинаково special Я бы сказал.

Я хотел бы знать, есть ли какие-то общие правила, которые применяются не только к моей ситуации, но и должны быть.Кажется, моя ошибка не случайна.

Редактировать 2:

Ответ любезно предоставлен Бо Мартинесом, указывая мне на ссылку на язык, где я должен был посмотретьво-первых:

http://www.dcl.hpi.uni -potsdam.de / home / loewis / table-3131.html Похоже, все разрешенные символы выбраны.

Ответы [ 3 ]

4 голосов
/ 18 августа 2010

Согласно справочнику по языку , Python 3 допускает большое разнообразие символов в качестве идентификаторов.

Этот нулевой индекс выглядит как число, но это не для Python;Python рассматривает только 0, 1, 2, 3, 4, 5, 6, 7, 8 и 9 как числа.На самом деле это символ, так что вы можете использовать его в качестве идентификатора (как если бы он был, например, вместо греческого символа, такого как Phi).

Важно, как легко вы можете ввести эти символыс вашей клавиатурой?Например, я не хочу открывать карту персонажей каждый раз, когда мне приходится вызывать ваши функции.Называя его «Maximum_decay_rate» или что-то гораздо более интуитивно понятное для любого пользователя, а не только для специалиста по физике, делает ваш код более читабельным.

Если вы говорите, что это не разрешено, возможно, вы не указали кодировка символов для вашего исходного файла.Это можно указать, указав # -*- coding: utf-8 -*- (или кодировку) в начале вашего исходного файла.

3 голосов
/ 13 августа 2010

Сообщите Python, что такое правильная кодировка:

https://www.python.org/dev/peps/pep-0263/

Либо ...

# -*- coding: utf-8 -*-

или

# coding=utf-8

AsЧто касается того, какие символы фактически разрешены в именах переменных, обычно это буквенные символы, цифры и символы подчеркивания.

«Нулевой индекс» на самом деле не цифра, это индекс.

0 голосов
/ 21 июня 2014

Каждый символ Unicode имеет определенные «свойства», которые можно найти в базе данных символов Unicode, и для нашей цели наиболее важны свойства из так называемой Общей категории.Они позволяют разбить все символы на большие группы:

  • буквы (L)
  • цифры (N)
  • знаки (M)
  • знаки пунктуации (P)
  • символы (S)
  • разделители (Z)
  • другие (C)

Группы имеют подгруппы, например Lu - это Uppercase_Letter.Согласно справочнику по языку Python (3.4.1), сначала необходимо нормализовать последовательность символов в форме NFKC (что на практике означает разложение символов с диакритическими знаками и их «упрощение», например, изменение нижнего индекса 0 в обычный 0).Затем, начало идентификатора должно быть либо подчеркиванием, либо буквой (вся группа букв плюс Nl - буквенные числа), а также несколько других буквенных символов.Это становится намного интереснее, когда мы смотрим на символы, которые разрешены как продолжение идентификатора.Кроме того, мы можем использовать: Decimal_Numbers (Nd), которые на самом деле являются цифрами от 0 до 9, но во многих формах, например MATHEMATICAL MONOSPACE DIGIT NINE, который является символом \U0001D7FF (всего вместе 70 символов);большинство знаков (M), за исключением ограждающих знаков (Me) - здесь мы имеем все диакритические знаки (акценты);все символы из подгруппы Pc - знаки препинания, поэтому не только подчеркивание, но и различные связи (10 символов);некоторые дополнительные цифры, похожие на цифры (например, эфиопские цифры от 0 до 9);средние точки (2 символа).

Как видно из вышеизложенного, N с индексом 0 следует принимать как идентификатор.Когда я попытался вставить его из Word, и IDLE, и Wing 101 вставили нормализованные формы в редактор (т.е. N0).Я подозреваю, что автор вопроса пытался использовать подстрочный символ, который не мог быть должным образом нормализован.

...