[英]Python: Why return-type of itemgetter is not consistent
Python itemgetter
不返回長度為 0 或 1 的元組。例如:
from operator import itemgetter
def get_something(keys):
d = {
"a": 1,
"b": 2,
"c": 3
}
return itemgetter(*keys)(d)
print(type(get_something(["a", "b"])))
# <class 'tuple'>
print(type(get_something(["a"])))
# <class 'int'>
print(type(get_something([])))
# TypeError: itemgetter expected 1 arguments, got 0
itemgetter
這樣寫有什么好的理由嗎? 而不是(1,)
倒數第二個()
和最后一個?
如果我總是想返回給定鍵的元組/列表,是否還有其他內置選項?
如果我總是想返回給定鍵的元組/列表,是否還有其他內置選項?
只需使用理解:
[d[k] for k in keys]
在上下文中:
from operator import itemgetter
def get_something(keys):
d = {
"a": 1,
"b": 2,
"c": 3
}
return [d[k] for k in keys]
print(get_something(["a", "b"]))
#[1, 2]
print(get_something(["a"]))
#[1]
print(get_something([]))
#[]
您的部分困惑來自這樣一個事實,即您的get_something()
函數采用單個參數(預計是可迭代的)並在將其傳遞給itemgetter()
時將其解包。 這導致get_something()
的返回值get_something()
參數不“對稱”。
如果您將get_something()
定義為使用可變參數(如itemgetter()
那樣):
def get_something(*keys):
d = {
"a": 1,
"b": 2,
"c": 3
}
return itemgetter(*keys)(d)
返回值將與參數更一致,即:
# ask for 3 keys, get 3 values:
>>> get_something("a", "b", "c")
(1, 2, 3)
# ask for 2 keys, get 2 values:
>>> get_something("a", "b")
(1, 2)
# ask for one key, get 1 value
>>> get_something("a")
1
# all of this with tuple unpacking in mind:
a, b = get_something("a", "b")
a = get_something("a")
現在的重點是,很少有人會費心使用itemgetter()
來實現您的get_something
函數 - itemgetter
主要被設計為用作sorted()
和類似函數/方法(當前行為有意義)的get_something
,以及get_something
將更規范地使用列表表達式實現,即:
def get_something(keys):
d = {
"a": 1,
"b": 2,
"c": 3
}
return [d[k] for k in keys]
這將需要一個迭代並返回一個(可能是空的)列表。
這種行為記錄在文檔中(重點是我的):
返回一個可調用對象,該對象使用操作數的
__getitem__()
方法從其操作數中獲取項目。 如果指定了多個項目,則返回查找值的元組
itemgetter
不決定返回類型,它是操作數的__getitem__()
方法。
會不會更容易/更好
“更好”是主觀的。 你總是可以包裝itemgetter
:
def get_something(keys):
def my_itemgetter():
r = itemgetter(*keys)(d)
return (r,) if type(r) is not tuple else r
d = {
"a": 1,
"b": 2,
"c": 3
}
return my_itemgetter()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.