2014-12-03 2 views
3

Python 3.x опора (опция) Функция аннотации:Как аннотировать генератор в python3?

def add_ints(x:int, y:int) -> int : 
    return x+y 

я иногда сталкивается с проблемами о том, как представлять данный «тип» могут быть представлены, и на этот раз, у меня есть функция, которая возвращает генератор :

def myfunc(x: [int]) -> "generator that returns ints": 
    #      ^~~~~~~~~~~~~~~~~~~~~~~~~~ 
    return (n for n in x if n%2 == 0) 

Как следует аннотировать возвращаемое значение? Есть ли ссылка, с которой я могу справиться?

+0

В частности, что вы пытаетесь сделать, добавив эту аннотацию, Python, кажется, ничего не требует, кроме того, что он является допустимым выражением и не использует его внутренне. Там, похоже, нет рекомендаций или стандартов, поэтому я бы просто сделал все, что было бы проще для вашего дела. – KSab

+0

@KSab Спасибо за комментарий. Знание отсутствия рекомендаций - хорошее начало для меня ... Хотя python не использует аннотации внутри, недействительные выражения пойманы, поэтому я не могу просто «-> generator (int)», не делая его строкой. – Yosh

+0

Я предполагаю, что вы можете использовать types.GeneratorType (см. Https://docs.python.org/2/library/types.html), но вы не можете указать, что это генератор 'int' (генераторы Python могут возвратите несколько типов в любом случае). Если вы просто делаете это для своей собственной проверки типов, я не вижу причин не использовать строковый идентификатор или, может быть, глобальную переменную. – KSab

ответ

1

Аннотации в Python 3 могут быть любым допустимым выражением, а не только типом, и на самом деле не используются для чего-либо внутри (более подробно об аннотациях, https://www.python.org/dev/peps/pep-3107). Нет никаких рекомендаций или стандартов относительно того, как использовать эти аннотации, чтобы их можно было использовать любым способом, который проще всего для кодера (см. https://www.python.org/dev/peps/pep-0008#programming-recommendations).

В вашем конкретном случае вы можете использовать строку или глобальную переменную для указания вашего типа или, возможно, types.GeneratorType, хотя нет способа указать, что генератор производит int с.

11

typing module определяет тип генератора, который можно использовать как:

Generator[yield_type, send_type, return_type] 

Смотрите также PEP 0484.

Смежные вопросы