首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得创建`operator.itemgetter`的键列表?

如何获得创建`operator.itemgetter`的键列表?
EN

Stack Overflow用户
提问于 2022-10-28 12:06:55
回答 2查看 48关注 0票数 2

我有一个operator.itemgetter()对象。

代码语言:javascript
复制
import operator
keyfunc = operator.itemgetter("key1", "key2")

现在,我传递它,然后我希望得到它创建的键列表。

代码语言:javascript
复制
# doesn't exist, but should return something like ("key1", "key2")
keys = keyfunc.keys()

该对象显然存储这些键,以便与__call__一起使用,并打印它们:

代码语言:javascript
复制
>>> print(keyfunc)
operator.itemgetter('key1', 'key2')

但是,我没有发现可能在dir(keyfunc)输出中返回这些键的成员。文档也没有列出这个查询的访问器。

我是否需要解析字符串表示的输出(或者将键与对象一起存储和传递)?

代码语言:javascript
复制
# this feels a bit hacky
import ast
keys = ast.literal_eval(repr(keyfunc).replace("operator.itemgetter", ""))
EN

回答 2

Stack Overflow用户

发布于 2022-10-28 12:19:40

来自源代码

代码语言:javascript
复制
class itemgetter:
    __slots__ = ('_items', '_call')
    
    def __init__(self, item, *items):
        if not items:
            self._items = (item,)  

因此,密钥存储在_items属性中。但是,当您尝试访问它时,您将得到一个AttributeError

代码语言:javascript
复制
>>> a._items
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'operator.itemgetter' object has no attribute '_items'

因此,阅读更多的源代码,我们可以看到dunder __reduce__是在类中定义的,所以可以使用它:

代码语言:javascript
复制
def __reduce__(self):
    return self.__class__, self._items

  >>> a.__reduce__()
(<class 'operator.itemgetter'>, ('a', 'b'))
票数 1
EN

Stack Overflow用户

发布于 2022-10-28 12:47:22

另一个黑客:将其用于跟踪项目对象要求的虚拟对象上:

代码语言:javascript
复制
from collections import defaultdict
d = defaultdict(bool)
keyfunc(d)
print(list(d))

输出(在网上试试!):

代码语言:javascript
复制
['key1', 'key2']

这假设您没有使用重复的键,这些键是hashable的,并且itemgetter按原来的顺序要求这些键。

另一种,它可以处理重复和不可保存的键:

代码语言:javascript
复制
def itemgetter_keys(ig):
    keys = []
    class C:
        __getitem__ = keys.append
    ig(C())
    return keys

print(itemgetter_keys(keyfunc))

相同的输出['key1', 'key2'] (在网上试试!)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74235179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档