gpt4 book ai didi

Python:itemgetter() 返回的函数在类中没有按预期工作

转载 作者:太空狗 更新时间:2023-10-29 20:59:32 26 4
gpt4 key购买 nike

operator.itemgetter()函数是这样工作的:

>>> import operator
>>> getseconditem = operator.itemgetter(1)
>>> ls = ['a', 'b', 'c', 'd']
>>> getseconditem(ls)
'b'

编辑我添加了这部分以突出不一致

>>> def myitemgetter(item):
... def g(obj):
... return obj[item]
... return g
>>> mygetseconditem = myitemgetter(1)

现在,我有这门课

>>> class Items(object):
... second = getseconditem
... mysecond = mygetseconditem
...
... def __init__(self, *items):
... self.items = items
...
... def __getitem__(self, i):
... return self.items[i]

访问第二个项目及其索引有效

>>> obj = Items('a', 'b', 'c', 'd')
>>> obj[1]
>>> 'b'

通过 mysecond 方法访问它也是如此

>>> obj.mysecond()
'b'

但由于某些原因,使用second() 方法会引发异常

>>> obj.second()
TypeError: itemgetter expected 1 arguments, got 0

什么给了?

最佳答案

obj.second 是函数 getseconditem。一个需要参数进行操作的函数。由于您调用 obj.second 时没有任何参数,因此会引发您给出的错误。要解决它,您可以执行 obj.second(obj.items) 或以不同方式定义 second:

class Items(object):
def __init__(self, *items):
self.items = items

def __getitem__(self, i):
return self.items[i]

def second(self):
return getseconditem(self.items)

编辑

编辑问题后,您现在的意思很清楚。我认为这里发生的事情是因为 getseconditem 不是 user-defined 函数,所以它不会在访问 obj.second 时转换为方法>。它只是一个功能。在 docs 中可以找到以下内容:

Note that the transformation from function object to (unbound or bound) method object happens each time the attribute is retrieved from the class or instance. In some cases, a fruitful optimization is to assign the attribute to a local variable and call that local variable. Also notice that this transformation only happens for user-defined functions; other callable objects (and all non-callable objects) are retrieved without transformation.

关于Python:itemgetter() 返回的函数在类中没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8906392/

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