我应该如何使函数中的参数可见?
How visible should I make the parameters in a function?
假设我们有一个函数,它从字典中获取参数值。我应该包括所有单独的参数还是只包括整个字典作为参数?
下面是一个简单的例子:
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])
我投票给 Way 2
,因为它隐藏了您函数中的更多工作。这使您的主代码更清晰,更易于理解。该函数更复杂,但如果命名得当(如本例所示),则更容易理解。
+1 表示这是一个风格问题。
通过不在此处使用普通词典来完全避免该问题。相反,使用 class - namedtuple
在这里很合适,但是 subclass 它所以你可以添加 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]
根据您最初获取这些字典的方式,您也许可以在此时创建命名元组,并对属性使用正常的小写约定。
还有一种可能,虽然我不知道是不是更好:
# Way 3
def get_total(PRICE, QUANTITY, **customer_order):
total = PRICE * QUANTITY
return total
get_total(**customer_orders[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])
我投票给 Way 2
,因为它隐藏了您函数中的更多工作。这使您的主代码更清晰,更易于理解。该函数更复杂,但如果命名得当(如本例所示),则更容易理解。
+1 表示这是一个风格问题。
通过不在此处使用普通词典来完全避免该问题。相反,使用 class - namedtuple
在这里很合适,但是 subclass 它所以你可以添加 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]
根据您最初获取这些字典的方式,您也许可以在此时创建命名元组,并对属性使用正常的小写约定。
还有一种可能,虽然我不知道是不是更好:
# Way 3
def get_total(PRICE, QUANTITY, **customer_order):
total = PRICE * QUANTITY
return total
get_total(**customer_orders[0])