我正在尝试将一些代码从 2 转换为 3 以及以下简单脚本
import types
from types import NoneType
结果是
ImportError:无法导入名称 NoneType
如何将上面的 2 转换为 3?
原文由 deltanovember 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在尝试将一些代码从 2 转换为 3 以及以下简单脚本
import types
from types import NoneType
结果是
ImportError:无法导入名称 NoneType
如何将上面的 2 转换为 3?
原文由 deltanovember 发布,翻译遵循 CC BY-SA 4.0 许可协议
获取 NoneType
在执行验证时很有用,可以缩短通过允许的条件链 None
输入可接受类型的元组。所以不要写这样的东西:
a = {
# A dict with some fields...
}
# In this example, the optional field is valid if it is a string
is_valid = (
a.get(optional_field) is None
or isinstance(a[optional_field], str)
)
可以这样写:
is_valid = isinstance(a.get(optional_field), (str, NoneType))
可以通过将默认字符串值传递给 .get(...)
来解决此问题(因为在没有该字段的情况下,您将返回有意通过验证的内容,即使该值不存在) , 但它太 hacky,晦涩难懂,确实影响可读性。
由于 NoneType
不再是您可以导入的东西,您可以在需要时制作自己的东西。这些是一些选项:
NoneType = type(None)
NoneType = None.__class__
如果您遵循 PEP8 建议,linter 可能会抱怨名为 NoneType
的变量不符合您的命名约定。我发现只要在需要 NoneType
的地方使用 type(None)
就更容易了。它只有两个字符的区别,就像可读性一样,你节省了一行代码;)
上面代码片段的最终解决方案如下所示:
is_valid = isinstance(a.get(optional_field), (str, type(None)))
原文由 Victor Schröder 发布,翻译遵循 CC BY-SA 4.0 许可协议
4 回答4.4k 阅读✓ 已解决
1 回答3.1k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
1 回答4.4k 阅读✓ 已解决
1 回答3.9k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
types
模块中不再有NoneType
引用。您应该直接使用None
检查身份,即obj is None
。另一种方法,如果你真的需要NoneType
,将使用:这实际上与之前定义的
types.NoneType
完全相同,在 2007 年 11 月 28 日 被删除之前。作为旁注,您不需要导入模块即可使用
from .. import
语法,因此如果您不使用模块引用,则可以删除import types
行其他任何地方。