我有一个operator.itemgetter()对象。
import operator
keyfunc = operator.itemgetter("key1", "key2")现在,我传递它,然后我希望得到它创建的键列表。
# doesn't exist, but should return something like ("key1", "key2")
keys = keyfunc.keys()该对象显然存储这些键,以便与__call__一起使用,并打印它们:
>>> print(keyfunc)
operator.itemgetter('key1', 'key2')但是,我没有发现可能在dir(keyfunc)输出中返回这些键的成员。文档也没有列出这个查询的访问器。
我是否需要解析字符串表示的输出(或者将键与对象一起存储和传递)?
# this feels a bit hacky
import ast
keys = ast.literal_eval(repr(keyfunc).replace("operator.itemgetter", ""))发布于 2022-10-28 12:19:40
来自源代码
class itemgetter:
__slots__ = ('_items', '_call')
def __init__(self, item, *items):
if not items:
self._items = (item,) 因此,密钥存储在_items属性中。但是,当您尝试访问它时,您将得到一个AttributeError
>>> a._items
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'operator.itemgetter' object has no attribute '_items'因此,阅读更多的源代码,我们可以看到dunder __reduce__是在类中定义的,所以可以使用它:
def __reduce__(self):
return self.__class__, self._items
>>> a.__reduce__()
(<class 'operator.itemgetter'>, ('a', 'b'))发布于 2022-10-28 12:47:22
另一个黑客:将其用于跟踪项目对象要求的虚拟对象上:
from collections import defaultdict
d = defaultdict(bool)
keyfunc(d)
print(list(d))输出(在网上试试!):
['key1', 'key2']这假设您没有使用重复的键,这些键是hashable的,并且itemgetter按原来的顺序要求这些键。
另一种,它可以处理重复和不可保存的键:
def itemgetter_keys(ig):
keys = []
class C:
__getitem__ = keys.append
ig(C())
return keys
print(itemgetter_keys(keyfunc))相同的输出['key1', 'key2'] (在网上试试!)。
https://stackoverflow.com/questions/74235179
复制相似问题