Можете ли вы передать аргумент None, если для строки документации требуется строка?
Хорошо, на этот вопрос, возможно, где-то был дан ответ, но мой Google-фу еще не нашел правильную комбинацию ключевых слов.
У меня есть функция, которая принимает строку, но когда я передаю None, проверка Pycharm отмечает ошибку типа. Это ошибка в линтере? None считается строкой? Я знаю, что могу вызывать функцию с пустой строкой, но я думаю, что я также должен использовать None.
def my_func(some_str):
""" does something
Arguments:
some_str (str): a string
"""
# do something
...
my_func(None) <-- throws Expected type 'str', got 'None' instead
3 ответа
Как несогласное мнение, Python не является строго типизированным, поэтому для подражания pycharm, чтобы подчеркнуть, что как ошибка мне кажется немного странным.
Конечно, есть много функций, которым на законных основаниях нужна строка, но я уверен, что где-то видел, что "хорошей практикой" для этого была функция, которая выглядела примерно так:
def myfunct(s):
try:
s = str(s)
except TypeError:
raise TypeError('message explaining function usage')
# actual function
Это работает со всем, что может быть приведено в строку, что кажется более разумным, чем буквальное требование строки.
Я чокнутый?
Сначала ответь на твой вопрос None
это не str
Это единственная ценность type.Nonetype
это питон, построенный в Contstant. Читайте об этом здесь. И есть много способов обойти / справиться возможно None
вход
1. Чтобы обойти это, не собираюсь обращаться с None:
ожидает str
так что, конечно, выдает ошибку. просто пройдите ""
вместо. но в этом случае зовет my_func(None)
все равно выдаст вам ошибку.
my_func("")
2. Обращаться можно None
вход:
если вы хотите справиться None
в качестве одного из возможных входных параметров, затем установите ваш параметр на необязательный параметр с помощью *
таким образом, вы можете ввести None
и не получить ошибку
def my_func(*some_str):
ИЛИ ЖЕ
Ваш вход по умолчанию None
если значение, переданное пользователем, не None
тогда вы знаете, пользовательский пароль в другом: это позволяет вам сделать my_func(None)
и не получить ошибку
def my_func(some_str = None):
if some_str:
#do something
Примечание: это также позволяет вам лечить None
а также ''
в равной степени (спасибо Stael за указание)
None
не считается строкой None
является единственным членом класса NoneType
,
Чтобы сделать то, что вы хотите, организуйте, чтобы ваша функция принимала необязательный строковый аргумент.
def my_func(some_str: str = None):
Тогда не передавайте это None
Передай ничего
a = my_func()