2015-11-26 3 views
3

Предположим, у меня есть функция, как это:намеков типа Python и `* args`

def foo(*args): 
    for x in args: 
     print(x) 

и давайте говорить, что я хочу сказать, что все элементы args являются int; Каков правильный способ выразить это как PEP 0484? Должен ли я сделать что-то вроде

from typing import Tuple 


def foo(*args: Tuple[int, ...]) -> None: 
    for x in args: 
     print(x) 

или что-то вроде

def foo(*args: int) -> None: 
    for x in args: 
     print(x) 

или что-то совсем другое?

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

+0

Ваш первый подход является правильным, используйте 'Кортеж [ИНТ, .. ] ',' * args: int' всегда будет ошибочным, так как Python создаст кортеж для '* args' с переданными избыточными позиционными значениями. –

ответ

1

По PEP-484:

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

def foo(*args: str, **kwds: int): ... 

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

foo('a', 'b', 'c') 
foo(x=1, y=2) 
foo('', z=0) 

В корпусе функции foo тип переменной args определяется как Tuple[str, ...], а тип переменной kwds - Dict[str, int].

Правильный способ аннотировать функцию foo из вашего примера:

def foo(*args: int): 
    for x in args: 
     print(x) 

В Python 2:

def foo(*args): 
    # type: (*int) -> NoReturn 
    for x in args: 
     print(x) 
1

Вы должны взглянуть на докстроны. PyCharm позволяет вам определять свои аргументы в docstrings, с или без типов. Если вы определяете типы, в подсказках будет учитываться тип аргументов.

def foo(*args): 
    """ 
    General information about foo 
    :param [int] args: info about args 
    """ 

    for x in args: 
     print(x) 
+0

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

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