当 docstring 需要字符串时,可以传递 None 参数吗?

问题描述 投票:0回答:4

好吧,这个问题可能已经在某个地方得到了回答,但我的 Google-fu 还没有找到正确的关键字组合。

我有一个接受字符串的函数,但是当我传递 None 时,Pycharm 的检查会标记类型错误。这是 linter 中的错误吗? 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
python pycharm lint docstring
4个回答
3
投票

首先回答你的问题

None
不是
str
它是
type.Nonetype
的唯一值它是一个Python内置的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 指出)


1
投票

作为一个不同意见,Python 不是强类型的,因此 pycharm 的 linter 将其突出显示为错误对我来说似乎有点奇怪。

当然,有许多函数合法地需要字符串,但我确信我在某个地方看到了“良好实践”,它是一个看起来更像这样的函数:

def myfunct(s):
    try:
        s = str(s)
    except TypeError:
        raise TypeError('message explaining function usage')
    # actual function

这适用于任何可以强制转换为字符串的东西,这似乎比字面意义上的字符串更明智。

我疯了吗?


1
投票

None
不算作字符串。
None
NoneType
班的唯一成员。

要执行您想要的操作,请安排您的函数接受可选的字符串参数。

def my_func(some_str: str = None):

那就别传了

None
,什么都不传:

a = my_func()

0
投票

回答标题中的问题:是的,您可以传递

None
而不是字符串。 docstring 在运行时被忽略。

linter 只是检查您的文档字符串是否与您使用该函数的方式匹配。 Pycharm 正确地抱怨

None
不是字符串。字符串的示例为
"astring"
"None"
""
None
然而与字符串不同,它是 Python 中定义的特定单例。

但是,如果您传入

None
,您的函数是否会成功退出或引发错误取决于其源代码。例如。如果传入
some_str.upper()
None
将不起作用,因为
NoneType
没有名为
upper
的方法。

最后,如果您使用文档字符串,则应该保持它们的准确性。如果您不愿意这样做,那么您可能根本就没有文档字符串。我找不到此文档字符串样式的确切语法,但类似以下内容的内容应该可以工作:

""" does something
Arguments:
some_str (str|None): a string
"""
© www.soinside.com 2019 - 2024. All rights reserved.