Учтите следующее:
def some_function():
return 1
def some_generator():
yield 1
В приведенном выше коде some_function
это функция, а some_generator
является генератором. Они выглядят очень похоже.
Проблема, с которой я сталкиваюсь при чтении кода, заключается в том, что мне нужно просмотреть каждую строку в «функции» в поисках yield
ключевого слова, прежде чем я смогу определить, является ли оно на самом деле функцией или генератором!
Мне просто кажется, что использование другого ключевого слова для генераторов имело бы больше смысла, например:
gen some_generator():
yield 1
Каковы преимущества использования def
ключевого слова для генераторов и функций? Почему новое ключевое слово не было введено для разделения функций и генераторов?
design
programming-languages
python
Дерек Квок
источник
источник
gen
вместо того,def
чтобы сделать это преобразование значительно более обременительным.Ответы:
"Каковы преимущества использования ключевого слова def для генераторов и функций?"
Хотя они механически различны, на практике, когда я их использую, они часто концептуально для меня одинаковы (я не особо думаю о вызовах
range()
противxrange()
).С точки зрения понимания, что такое функция быстро, я согласен, что с использованием чего-то теряется
def
, но вещи не должны быть слишком запутанными внутри функции для начала.Даже неявное
return None
может привести к путанице в предполагаемом поведении функции после долгих условныхreturn None
выражений (например, было задумано как конечное поведение или недосмотр в логике). Но это всего лишь мое мнение об этом.Я не чувствую, что мой аргумент особенно убедителен, поэтому я просто отложу рассмотрение до 255 :
источник
await
(иasync with
иasync for
) синтаксические конструкции, добавленные в PEP 492 , которые работают очень похожеyield from
, требуют объявления функции, в которой они используются,async def
а не простоdef
.Добавление новых ключевых слов рискует сломать существующие программы. Разработчики языка обычно стараются избегать добавления новых ключевых слов, особенно для языковых функций, добавленных после того, как язык уже приобрел некоторую популярность. Каждое ключевое слово, которое они добавляют, является идентификатором, который программам запрещено использовать для других целей, поэтому добавление ключевого слова может потенциально сломать существующие программы. Языковые дизайнеры должны сопоставить преимущества нового ключевого слова с затратами.
Я сомневаюсь, что определение отдельного ключевого слова для генераторов принесло бы большую пользу. Понимание того, соответствует ли символ имени функции или имени генератора, является чем-то, что имеет значение для вызывающих, и вызывающие не должны (а иногда и не могут) смотреть, какое ключевое слово использовалось для его реализации. Это ответственность лучшего соглашения об именах и документации.
источник
Генераторы - это функции, которые оценивают лениво. Учитывая, что в основе их лежит одно и то же, имеет смысл использовать одно и то же ключевое слово. Одним из вариантов может быть использование комментария для определения того, что есть для данного экземпляра:
источник
Я предполагаю, что это потому, что это больше Pythonic, но что я знаю? ;)
Я не думаю, что это так важно. Мне легче запомнить, потому что не нужно запоминать их обоих.
РЕДАКТИРОВАТЬ: ОПТОСОЗ может сказать, вы могли бы расследовать там.
источник