gpt4 book ai didi

python - 是否可以编写一个行为类似于 getattr() 的函数签名?

转载 作者:太空宇宙 更新时间:2023-11-03 13:32:32 27 4
gpt4 key购买 nike

根据help(getattr),接受两个或三个参数:

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

做一些简单的测试,我们可以证实这一点:

>>> obj = {}
>>> getattr(obj, 'get')
<built-in method get of dict object at 0x7f6d4beaf168>
>>> getattr(obj, 'bad', 'with default')
'with default'

太少/太多参数也按预期表现:

>>> getattr()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: getattr expected at least 2 arguments, got 0
>>> getattr(obj, 'get', 'with default', 'extra')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: getattr expected at most 3 arguments, got 4

帮助文本中指定的参数名称似乎不被接受为关键字参数:

>>> getattr(object=obj, name='get')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: getattr() takes no keyword arguments

inspect 模块在这里没有帮助:

>>> import inspect
>>> inspect.getargspec(getattr)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/inspect.py", line 816, in getargspec
raise TypeError('{!r} is not a Python function'.format(func))
TypeError: <built-in function getattr> is not a Python function

(messaging is a little different in python3, but the gist is the same)

现在,问题是:是否有一种直接的方法来编写我自己的 Python 函数,其签名的行为与 getattr 的签名完全一样?也就是说,不允许关键字参数,并且强制执行最小/最大数量的参数?我最接近的是:

def myfunc(*args):
len_args = len(args)
if len_args < 2:
raise TypeError('expected at least 2 arguments, got %d' % len_args)
elif len_args > 3:
raise TypeError('expected at most 3 arguments, got %d' % len_args)
...

但现在我们得到 args[0]args[1]< 而不是像 objectname 这样有意义的参数名称。这也是很多样板文件,感觉非常不愉快。我知道,作为内置函数,getattr 的实现必须与典型的 Python 代码大不相同,也许没有办法完美地模拟它的行为方式。但这是我有一段时间的好奇心。

最佳答案

此代码符合您的大部分要求:

def anonymise_args(fn):
@functools.wraps(fn)
def wrap(*args):
return fn(*args)
return wrap


@anonymise_args
def myfunc(obj, name, default=None):
print obj, name, default
  • 不允许关键字参数

    x.myfunc(obj=1, name=2)
    TypeError: wrap() got an unexpected keyword argument 'obj'
  • 强制执行最小/最大数量的参数

    x.myfunc(1,2,3,4)
    TypeError: myfunc() takes at most 3 arguments (4 given)
  • 有意义的参数名称

  • 没有太多样板文件

关于python - 是否可以编写一个行为类似于 getattr() 的函数签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44550088/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com