2015-10-12 1 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 

все-заглавные буквы имен атрибутов некрасиво, но если они совпадают ключи словаря у вас уже есть , вы можете преобразовать список dicts в список namedtuples, как это:

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

в зависимости от того, как вы получите эти словари в первую очередь, вы могли бы быть в состоянии создать namedtuples вместо в этой точке, и использовать нормальное соглашение о нижнем регистре для атрибутов.

+1

Вы также можете использовать 'namedtuple («Order»,«ID ЦЕНА КОЛИЧЕСТВО in_stock»)', который я предпочитаю. –

0

Вот еще одна возможность, хотя я не знаю, что лучше:

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

get_total(**customer_orders[0])