Какой более питонный способ написать это объявление функции - PullRequest
0 голосов
/ 17 апреля 2011

Для краткости это разделено на самые основные элементы. Я понимаю, что нижеизложенное является излишним, как написано, но я отвлекся.

Я хочу знать, есть ли более умный и краткий способ написать это

def create_action(context, verb, actor = None, target = None, permission_level = None):
    action = Action(context = context, verb = verb, actor = actor, target = target, permission_level = permission_level)

Как видите, два обязательных аргумента, несколько (или, возможно, больше) необязательных аргументов перегружены.

Какой лучший способ написать это, чтобы я не перебирал эти ключевые слова?

Ответы [ 3 ]

6 голосов
/ 17 апреля 2011

Использовать распаковка аргументов :

def create_action(*args, **kwargs):
    action = Action(*args, **kwargs)
5 голосов
/ 17 апреля 2011

Прежде всего, удалите пробелы между частями аргументов по умолчанию. Вам также, вероятно, не нужно использовать аргументы ключевых слов для вызова Action() например,

def create_action(context, verb, actor=None, target=None, permission_level=None):
    action = Action(context, verb, actor, target, permission_level)

Это обычный стиль Python для использования аргументов по умолчанию.

Честно говоря, я не понимаю, зачем вообще нужна эта функция. он ничего не возвращает (я думаю, вы просто забыли вернуть действие, и все, что оно выполняет, должно быть сделано в методе __init__ для класса Action (я полагаю, это класс), например,

class Action(object):
    def __init__(context, verb, actor=None, target=None, permission_level=None):
        # Do something

Для краткости я бы вообще не писал функцию и просто использовал аргументы по умолчанию в методе __init__ класса.

0 голосов
/ 17 апреля 2011

Если вы хотите:

  • убедиться, что context и verb явно переданы
  • передать только допустимые аргументы

Вы можете сделатьчто-то вроде этого.

optional = ('actor', 'target', 'permission_level')
def create_action(context, verb, **opt):
  args = dict([(k, opt.get(k, None) for k in optional])
  action = Action(context, verb, **args)

или это, если вы хотите передать их все как именованные аргументы.

optional = (('actor', None), ('target', None), ('permission_level', None))
required = ('context', 'verb')
def create_action(*a, **kv):
  req = zip(required, a)
  opt = [(t[0], kv.get(t[0], t[1])) for t in optional]
  action = Action(**dict(req + opt))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...