簡體   English   中英

Python:為什么 itemgetter 的返回類型不一致

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM