2016-01-21 2 views
0

Я должен предоставить python sdk, и теперь я в дилемме о том, как мне создать метод.Лучшая практика для прототипа метода python

Просто сказать, что имя функции func, func должно принять около 10 параметров. Я знаю, что мы можем определить функцию, как таким образом:

def func(para0, para1, para2, para3, para4, para5, para6, para7, para8, para9) 

или

def func(obj_param) 

и obj_param разработан как экземпляр класса, который содержит para0 ~ para9.

Тогда это путинский путь? или оба в порядке?

Основания на вопросе @ deceze, я добавить некоторые ограничения: para0 ~ para9 имен буквально (не могут измениться на другое имя), и para0 ~ param6 является обязательным, левые не являются обязательными.

+0

Все ли они обязательны или не обязательны для заполнения?Являются ли некоторые необязательные и другие обязательными? Являются ли они очень разными параметрами, или они довольно буквально param0-9 (список действительно)? - Как разработать API во многом зависит от его специфики, нет общего ответа. – deceze

+1

Простой тест - вы можете написать некоторые прецеденты с этим методом и посмотреть, легко ли читать/отлаживать/улучшать такой вызов метода. Что касается меня, то чем больше параметров принимает функция, тем сложнее она будет использоваться. – soon

+1

Последующие действия: что представляют собой эти параметры? Я имею в виду, они * буквально * называются «param0» ?! Это ужасно бесполезное имя. Означает ли это, что вы действительно просто принимаете список вещей, которые должны быть как минимум 7 предметов ...? – deceze

ответ

3

Вы можете использовать kwargs и извлечь параметры для словаря. Я считаю, это лучшее решение, чем определение объекта

def func(**kwargs)

+0

Это самый пифонический тоже –

+0

@ Mr.E, это зависит. Вероятно, будут другие функции с одинаковыми параметрами - тогда их лучше извлечь в класс. – soon

+0

Это означает, что вам также нужно * передать все аргументы в качестве аргументов ключевого слова; это может быть или не быть желательным, и может получить чрезвычайно многословную информацию на вызывающей стороне для 10 параметров. – deceze

1

Есть несколько вариантов для вас.
Вы можете использовать

def foo(my_list): # pass a list as an argument and iterate over elements 
    pass 

или

def bar(*args): # pass only arguments 
    pass 
# example 
bar("text1", "text2", 2, 3) 

или

def foobar(**kwargs): # pass keyword arguments 
    for key in kwargs: 
     print(key, str(kwargs[key])) # will print key and value 

# example 
>>foobar(name="My name" surname="my last name", age=24, weight=80) 
('name', 'My name') 
('surname', 'my last name') 
('age', '24') 
('weight', '80') 
1

На мой взгляд, это зависит от параметров и то, что вы хотите сделать с ними.

Для примера скажем, ваша функция принимает 10 параметров, чтобы создать и сохранить модель с 10 полями, то правильный путь будет, например:

def func(**kwargs): 
    model = Model(**kwargs) 
    model.save() 

Тогда давайте представим, что первый параметр на самом деле класс модель, то это было бы:

def func(Class, **kwargs): 
    model = Class(**kwargs) 
    model.save() 

Теперь представьте, что все параметры являются экземплярами моделей, и вы хотите вернуть некоторые композиции, то наиболее логично было бы:

def func(*args): 
    average = 0 
    for inst in *args: 
     average += inst.value 
    return average 

Теперь представьте, что параметры являются параметрами для построения запроса, а целью вашей функции является возврат хеша запроса (например, чтобы приблизительно идентифицировать пользователя без надлежащей системы аутентификации), тогда разделение проблем сделало бы логично построить объект запроса вне функции и заставить функцию возвращать хеш, чтобы вы могли создавать запросы из других частей вашего кода и чтобы у вас могли быть разные типы объектов запроса. Тогда функция будет выглядеть так:

def func(request): 
    ... 
Смежные вопросы