try:
# equivalent to getattr() without specifying a default
# value = getattr(some_obj, 'some_attribute')
value = some_obj.some_attribute
# now you handle `None` the data here
if value is None:
# do something here because the attribute was set to None
except AttributeError:
# we're now hanling the exceptional situation from here.
# We could assign None as a default value if required.
value = None
# In addition, since we now know that some_obj doesn't have the
# attribute 'some_attribute' we could do something about that.
log_something(some_obj)
与dict类似:
try:
value = some_dict['some_key']
if value is None:
# do something here because 'some_key' is set to None
except KeyError:
# set a default
value = None
# and do something because 'some_key' was missing
# from the dict.
log_something(some_dict)
def my_function(**kwargs):
try:
value = kwargs['some_key']
if value is None:
# do something because 'some_key' is explicitly
# set to None
except KeyError:
# we assign the default
value = None
# and since it's not coming from the caller.
log_something('did not receive "some_key"')
def my_function(value, param1=undefined, param2=undefined):
if param1 is undefined:
# we know nothing was passed to it, not even None
log_something('param1 was missing')
param1 = None
if param2 is undefined:
# we got nothing here either
log_something('param2 was missing')
param2 = None
随着字典
value = some_dict.get('some_key', undefined)
if value is None:
log_something("'some_key' was set to None")
if value is undefined:
# we know that the dict didn't have 'some_key'
log_something("'some_key' was not set at all")
value = None
有了一个对象
value = getattr(obj, 'some_attribute', undefined)
if value is None:
log_something("'obj.some_attribute' was set to None")
if value is undefined:
# we know that there's no obj.some_attribute
log_something("no 'some_attribute' set on obj")
value = None
正如我前面提到的,定制哨兵有一些警告 . 首先,它们不是像 None 这样的关键字,所以python不保护它们 . 您可以随时在其定义的模块中的任何地方覆盖 undefined ,因此请小心如何公开和使用它们 . 接下来, object() 返回的实例不是单例,如果您进行10次调用,则会获得10个不同的对象 . 最后,使用哨兵是非常特殊的 . 哨兵特定于图书馆's used in and as such its scope should generally be limited to the library' s内部 . 它不应该是_197955的API .
57
在Python中,'null'对象是单例 None .
检查"Noneness"的最佳方法是使用标识运算符 is :
if foo is None:
...
47
它不像其他语言那样被称为null,而是None . 此对象始终只有一个实例,因此如果需要,可以检查 x is None (身份比较)而不是 x == None 的等效性 .
6 回答
在Python中,为了表示缺少值,可以对对象使用None值(types.NoneType.None),对字符串使用“”(或len()== 0) . 因此:
关于“==”和“is”之间的区别,使用“==”测试对象标识应该足够了 . 但是,由于操作“is”被定义为对象标识操作,因此使用它可能更正确,而不是“==” . 不确定是否存在速度差异 .
无论如何,你可以看看:
Python Built-in Constants doc页面 .
Python Truth Value Testing doc页面 .
如何从另一个文件导入分配值为none的变量?
我们说吧;
v = 2 x = 3
def kk():
y =无
或w = 2
e = 4
def ij():
class ur(bb):
d =无其他值导入,但赋值为none类型的变量除外 . 如何从其他文件导入无类型?
无,Python是null?
在Python中没有
null
,而是None
. 如前所述,测试某些东西的最准确方法是使用None
身份运算符,该运算符测试两个变量引用同一个对象 .基础知识
只有一个没有
None
是类NoneType
的唯一实例,并且实例化该类的任何进一步尝试都将返回相同的对象,这使None
成为单例 . Python的新手经常会看到提及NoneType
的错误消息,并想知道它是什么 . 我个人认为,这些消息可能只是简单地提及None
因为,正如我们很快就会看到的那样,None
几乎没有任何模棱两可的余地 . 因此,如果你看到一些TypeError
消息提到NoneType
可以做到这一点,那就知道它只是一个以不可能的方式使用的None
.此外,
None
是一个内置常量,一旦启动Python,它就可以在任何地方使用,无论是在模块,类还是函数中 . 相比之下NoneType
不是,你需要首先通过查询None
来获取它的引用 .你可以检查
None
's uniqueness with Python'的身份功能id()
. 它返回分配给对象的唯一编号,每个对象都有一个 . 如果两个变量的id相同,那么它们实际上指向同一个对象 .无法覆盖
在更旧版本的Python(2.4之前)中,可以重新分配
None
,但不能再重新分配 . 甚至不是作为类属性或在函数的范围内 .因此可以安全地假设所有
None
引用都是相同的 . 没有"custom"None
.要测试None,请使用is运算符
在编写代码时,您可能会尝试像这样测试Noneness:
或者像这样测试虚假
您需要了解其含义以及为什么明确这一点通常是一个好主意 .
案例1:测试值是否为None
为什么这样做
而不是
第一个相当于:
而表达式
value==None
实际上是这样应用的如果值真的是
None
那么你会得到你所期望的 .在大多数常见情况下,结果将是相同的,但是
__eq__()
方法打开了一扇门,无法保证准确性,因为它可以在类中被覆盖以提供特殊行为 .考虑这个课程 .
所以你在
None
上尝试它并且它有效但是它也适用于空字符串
但是
案例2:使用None作为布尔值
以下两个测试
实际上被评估为
None
是"falsey",意味着如果强制转换为布尔值,它将返回False
,如果应用not
运算符,它将返回True
. 但请注意,它不是None
独有的属性 . 除了False
本身之外,该属性由空列表,元组,集合,dicts,字符串以及0以及实现__bool__()
magic方法的类中的所有对象共享以返回False
.因此,当以下列方式测试变量时,请特别注意您在测试中包含或排除的内容:
在上面,你的意思是当值专门设置为
None
时调用init_value()
,或者你的意思是设置为0
的值,或空字符串,或空列表也应该触发初始化 . 就像我说的那样,要小心 . 因为Python中的情况通常比隐式更好 .在实践中没有
无用作信号值
None
在Python中具有特殊状态 . 它是最受欢迎的基准值,因为许多算法将其视为特殊值 . 在这种情况下,它可以用作标志来表明条件需要一些特殊处理(例如设置默认值) .您可以将
None
分配给函数的关键字参数,然后显式测试它 .您可以在尝试获取对象的属性时将其作为默认值返回,然后在执行特殊操作之前显式测试它 .
默认情况下,字典的
get()
方法在尝试访问不存在的键时返回None
:如果您尝试使用下标符号来访问它,则会引发
KeyError
同样,如果您尝试弹出不存在的项目
您可以使用通常设置为
None
的默认值来抑制无用作标志和有效值
None
的上述用法适用于不被认为是有效值的情况,但更像是做特殊事情的信号 . 然而,在某些情况下,有时候知道None
来自哪里是很重要的,因为即使它被用作信号,它也可能是数据的一部分 .当您使用
getattr(some_obj, 'attribute_name', None)
返回查询对象的属性时,None
不会告诉您您尝试访问的属性是否设置为None
,或者该对象是否完全不存在 . 从类似some_dict.get('some_key')
的字典访问密钥时,您不知道some_dict['some_key']
是否丢失或者是否设置为None
. 如果您需要该信息,处理此问题的常用方法是直接尝试从try/except
构造中访问属性或键:与dict类似:
以上两个例子说明了如何处理对象和字典的情况,函数怎么样?同样的事情,但我们使用双asterisks关键字参数:
无仅用作有效值
如果您发现您的代码充满了上述
try/except
模式,只是为了区分None
标志和None
数据,那么只需使用另一个测试值 . 有一种模式,其中超出有效值集的值作为数据结构中的数据的一部分插入,并用于控制和测试特殊条件(例如边界,状态等) . 这样的值称为哨兵,它可以None
用作信号的方式使用 . 在Python中创建一个哨兵是微不足道的 .上面的
undefined
对象是唯一的,因此它不是None
作为标志的绝佳替代品 . 一些警告适用,更多关于代码后的内容 .有功能
随着字典
有了一个对象
正如我前面提到的,定制哨兵有一些警告 . 首先,它们不是像
None
这样的关键字,所以python不保护它们 . 您可以随时在其定义的模块中的任何地方覆盖undefined
,因此请小心如何公开和使用它们 . 接下来,object()
返回的实例不是单例,如果您进行10次调用,则会获得10个不同的对象 . 最后,使用哨兵是非常特殊的 . 哨兵特定于图书馆's used in and as such its scope should generally be limited to the library' s内部 . 它不应该是_197955的API .在Python中,'null'对象是单例
None
.检查"Noneness"的最佳方法是使用标识运算符
is
:它不像其他语言那样被称为null,而是None . 此对象始终只有一个实例,因此如果需要,可以检查
x is None
(身份比较)而不是x == None
的等效性 .Per Truth value testing,'None'直接测试为FALSE,所以最简单的表达式就足够了: