python参数none_Python如何区分显式传递None作为内置函数中的参数

本文探讨了Python中getattr()函数的行为差异,特别关注了如何区分提供默认值与不提供时的情况。通过实例和MyObject类的实现,揭示了如何在客户端代码中模仿getattr的内部逻辑。讨论了使用特殊标记值检测默认参数缺失的方法。
摘要由CSDN通过智能技术生成

我试验了下一个代码:

>>> f = object()

# It's obvious behavior:

>>> f.foo

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'object' object has no attribute 'foo'

# However, the next one is surprising me!

>>> getattr(f, 'foo')

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'object' object has no attribute 'foo'

# And this one returns None as expected:

>>> getattr(f, 'foo', None)

然后我在PyCharm IDE中找到了getattr()的伪签名:

def getattr(object, name, default=None): # known special case of getattr

"""

getattr(object, name[, default]) -> value

Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.

When a default argument is given, it is returned when the attribute doesn't

exist; without it, an exception is raised in that case.

"""

pass

我的问题是python如何在内部区分这两种使用getattr()(可能还有其他函数)的场景?是否可以完全在客户端代码中执行类似的操作?

解决方法:

正如@scytale所说,getattr的伪签名并不完全符合它的实现.我已经看到尝试在纯Python中复制行为,看起来像这样:

class MyObject(object):

__marker = object()

def getvalue(key, default=__marker):

...

if key is __marker:

# no value supplied for default

....

换句话说,使用调用者无法轻易提供的标记值来检查是否没有给出默认值而不是None.

标签:python,python-internals,built-in

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值