Имя функции, возвращающей генератор - PullRequest
23 голосов
/ 27 января 2012

Как назвать функцию, которая возвращает генератор (то есть использует yield foo вместо return foo)?

  • Это определенно не getFoo(), потому что он не возвращает значение Foo.
  • Вероятно, это не foos(), потому что я предпочел бы иметь легко различимый префикс.
  • Это, вероятно, не совсем listFoo(), потому что он не возвращает list.
  • Вероятно, это не iterateFoo(), потому что этот префикс слишком длинный.

Какое ваше предпочтительное решение?

Обновление:

Хотя foos() может быть вполне хорошим решением в некоторых случаях, обратите внимание, как имена методов имеют тенденцию начинаться с глагола. Глагол передает идею, что это метод, а не поле данных, и, таким образом, помогает удобочитаемости. Если возможно, я бы предпочел решение, позволяющее легко отличать метод от поля данных.

Ответы [ 5 ]

17 голосов
/ 28 января 2012

Я думаю foo или foos - это возможности.Или, чтобы подражать диктам Python2 iteritems, вы можете использовать iterfoo.

7 голосов
/ 28 января 2012

Несмотря на то, что полезно иметь полезные имена, которые указывают на то, что происходит, я не думаю, что вообще необходимо использовать Венгерское обозначение для указания типа возврата функции.

Тип возвращаемого значения, вероятно, должен быть задокументирован в комментариях или в строке документации, но я бы предположил, что что-то вроде foos(), getfoos() или get_foos() будет лучшим для имени.

Если вы хотите, чтобы было очевидно, что это генератор, я бы предложил iterfoos() за его сходство с методами dict Python 2, такими как itervalues().

Имейте в виду, что многие встроенные функции, которые использовали для возврата списков, теперь являются генераторами в Python 3 (map(), dict.values() и т. Д.), Поэтому никого не должно удивлять, когда ваши функции, возвращающие последовательность, являются генераторами даже если вы не назвали это generate_foos() или каким-либо другим вариантом.

4 голосов
/ 13 декабря 2013

Наиболее точным было бы:

iterateFoo()
iterate_foo()
iter_foo()
iterFoo()

Вы конкретно говорите, что делает функция, в то же время совершенно ясно, зачем ее использовать.

1 голос
/ 28 января 2012

Несколько кратких предложений:

getFoos()
generateFoos()
yieldFoos()
allFoos()

Поскольку обычно вам не нужен генератор, чтобы просто получить все ваши foo, довольно часто для конкретной функции генератора предлагается более интересное имя:

getActiveFoos()
getGreenFoos()
getFoosMatchingCriteria(someCriteria)
getFoosOverTheNetworkIfTheDatabaseIsntBeingAJerkface()
0 голосов
/ 27 января 2012

genFoo ()

(... и некоторые дополнительные слова гарантируют, что это решение содержит не менее 30 символов)

...