Какой самый питонный способ передать каргам в этой функции? - PullRequest
0 голосов
/ 01 мая 2018

Я хочу создать функцию ярлыка для создания объекта вопроса в моих тестах django.

Мне не нравится все время печатать что-то вроде new_q(timedelta(minutes=1)), и я хочу написать эту временную дельту только один раз и иметь возможность передать ее аргументы хорошим способом в функцию new_q.

Есть ли какое-нибудь питонное решение для одной строки, в котором мне не нужно фиксировать kwargs в переменной, а затем создавать объект timedelta в новой строке?

from datetime import timedelta
from django.utils import timezone


def new_q(question_text = '', offset=timedelta(**kwargs)):
    time = timezone.now() + offset
    return Question.objects.create(question_text=question_text, pub_date=time)

использование:

test1 = new_q(minutes=1)
test2 = new_q('yo?', seconds=1)
test2 = new_q(question_text = 'maw?', hours=11)
test2 = new_q(question_text = 'maw?')
test2 = new_q('yo?')

Ответы [ 2 ]

0 голосов
/ 01 мая 2018
def new_q(question_text = '', **kwargs):
    time = timezone.now() + timedelta(**kwargs)
    ...

Это все еще довольно сжато: дважды упоминается kwargs, но нет offset или чего-либо еще.

0 голосов
/ 01 мая 2018

То, что вы пытаетесь написать здесь, не имеет смысла:

def new_q(question_text = '', offset=timedelta(**kwargs)):

Это создает значение по умолчанию для offset, и это значение создается путем вызова timedelta(**kwargs) того, что происходит в kwargs во время определения функции. (Что, вероятно, вообще ничего, так что вы получите NameError.)

То, что вы хотите, выглядит примерно так:

def new_q(question_text = '', offset=None, **kwargs):
    if offset is None:
        offset = timedelta(**kwargs)

Теперь вы вызываете timedelta, когда вызывается функция, а не когда она определена, и используете значение kwargs, переданное в функцию, а не любое значение, которое эта переменная имеет во время определения функции.

Конечно, вы можете добавить некоторую обработку ошибок, поэтому TypeError, который вы получаете для неизвестного ключевого аргумента, упоминает new_q вместо timedelta, и поэтому указывать offset и minutes - ошибка и т. д.

Кроме того, если кто-то не передает ни offset, ни каких-либо других аргументов ключевого слова, это создаст timedelta() - что является пустым timedelta (0 секунд). Это то, что вы хотите?

...