Как указать тип, который может быть либо целым числом, либо строкой

У меня есть функция, параметр которой должен быть целое число или строка.

from typing import int,str

def MyFunc(arg:int) -> None:
    print(arg)

но я хочу знать, как написать, чтобы пользователь arg мог быть как int, так и str?


person Ramin-RX7    schedule 10.06.2020    source источник
comment
Вот почему существуют print и input.   -  person William Brochensque junior    schedule 10.06.2020
comment
Нет чувак. Это просто пример, а моя функция другая   -  person Ramin-RX7    schedule 10.06.2020
comment
ой, ладно, извините..   -  person William Brochensque junior    schedule 10.06.2020


Ответы (2)


Прежде всего, я не думаю, что вам нужно использовать импорт, поскольку int и str являются базовыми типами.

Кроме того, моим решением было бы (python3)

from typing import Union

def MyFunc(arg:Union[int, str]) -> None:
    print(arg)

Это стандартный подход, который также позволит вам использовать средства проверки типов, такие как mypy. Ключевое слово Union указывает, что ваш аргумент может быть одним из типов, заключенных в квадратные скобки.

person HitLuca    schedule 10.06.2020
comment
Спасибо. Но можете ли вы сказать мне, в чем разница между arg:Union[int, str] и arg:[int, str]? - person Ramin-RX7; 10.06.2020
comment
Также я знал, что мне не нужно импортировать набор текста, но вы знаете пользователей SO. Они просто думают, что я не знаю, что печатаю, поэтому закрывают мой вопрос и передают его другому :) - person Ramin-RX7; 10.06.2020
comment
в основном вещи после символа : интерпретируются как тип для python и не используются во время выполнения. Туда можно положить большинство вещей, и он не будет жаловаться. Использование Union — лучший подход, потому что это универсальный способ определения типов, и его можно анализировать средствами проверки типов. наличие arg: int или str не может быть проверено, поэтому документация бесполезна - person HitLuca; 10.06.2020

Один из вариантов

def MyFunc(arg:"int or str") -> None:
    print(arg)

Другой вариант

def MyFunc(arg:[int,str]) -> None:
    print(arg)
person Ilya Stokolos    schedule 10.06.2020
comment
Спасибо. Но ваш второй пример не означает, что тип аргумента — это список? - person Ramin-RX7; 10.06.2020
comment
Обычно, если вы хотите указать, что аргумент представляет собой список, вы пишете def MyFunc(arg: list) -> None - person Ilya Stokolos; 10.06.2020
comment
Ага. Большое тебе спасибо. :) - person Ramin-RX7; 10.06.2020