2015-10-12 23 views
0

比方說,我們有一個函數,它將字典中的參數值作爲參數。我應該將所有單個參數還是僅包含整個字典作爲參數?我應該如何看到函數中的參數?

下面是一個簡單的例子:

customer_orders = [{"ID": 1, "PRICE": 20, "QUANTITY": 2, "IN_STOCK": "YES"}, 
        {....}] 

# Way 1 

def get_total(price, quantity): 
    total = price * quantity 
    return total 

price = customer_orders[0]["PRICE"] 
quantity = customer_orders[0]["QUANTITY"] 
order_total = get_total(price, quantity) 

# Way 2 
def get_total(customer_order): 
    price = customer_order["PRICE"] 
    quantity = customer_order["QUANTITY"] 
    total = price * quantity 
    return total 

order_total = get_total(customer_orders[0]) 

回答

1

我投Way 2,因爲它隱藏在更多的功能的工作。這使您的主代碼更清晰,更易於理解。該函數更復雜,但如果命名得很好(就像在這種情況下一樣),這使得它更易於理解。

+1注意這是一個樣式問題。

0

這裏完全避免使用普通字典的問題。相反,使用類 - 一個namedtuple非常適合這裏,但它的子類,所以你可以添加total作爲一個屬性:

from collections import namedtuple 

ordertuple = namedtuple('Order', ['ID', 'PRICE', 'QUANTITY', 'IN_STOCK']) 
class CustomerOrder(ordertuple): 
    @property 
    def total(self): 
     return self.PRICE * self.QUANTITY 

的全部大寫的屬性名是醜陋的,但如果他們匹配字典鍵你已經有了,你可以改變類型的字典列表爲這樣的namedtuples列表:

customer_orders = [CustomerOrder(**order) for order in customer_orders] 

取決於你如何得到擺在首位這些字典,你也許能在這一點上,而不是建立namedtuples,並使用正常的屬性小寫約定。

+1

你也可以使用'namedtuple(「訂單」,「ID價購買數量IN_STOCK」)'我喜歡。 –

0

這裏的另一種可能性,雖然我不知道這是否是最好做:

# Way 3 
def get_total(PRICE, QUANTITY, **customer_order): 
    total = PRICE * QUANTITY 
    return total 

get_total(**customer_orders[0]) 
相關問題