Объявление функции захвата в декораторе python [дубликат]

Из http://en.cppreference.com/w/cpp/numeric/random/random_device :

Обратите внимание, что std :: random_device может быть реализовано в терминах движка псевдослучайных чисел, если для реализации не доступен недетерминированный источник (например, аппаратное устройство).

blockquote>

Я ожидал бы достойной реализации, по крайней мере, RNG.

Редактирование: я подозреваю, что они сознательно выбрали выполнение одной и той же последовательности каждый раз, чтобы сделать очевидным тот факт, что поток не был таким случайным, как обещали.

39
задан skyler 27 September 2012 в 18:40
поделиться

4 ответа

Python3.x

В мире python3.x вы, вероятно, должны использовать объект Signature :

import inspect

def get_default_args(func):
    signature = inspect.signature(func)
    return {
        k: v.default
        for k, v in signature.parameters.items()
        if v.default is not inspect.Parameter.empty
    }

Python2.x (старый ответ)

Аргументы / значения по умолчанию могут быть объединены как:

import inspect
a = inspect.getargspec(eat_dog)
zip(a.args[-len(a.defaults):],a.defaults)

Здесь a.args[-len(a.defaults):] - аргументы со значениями по умолчанию и, очевидно, a.defaults - соответствующие значения по умолчанию .

Вы даже можете передать вывод zip в конструктор dict и создать сопоставление, подходящее для распаковки ключевых слов.


глядя на документы, это решение будет работать только на python2.6 или новее, так как я предполагаю, что inspect.getargspec возвращает с именем tuple . Более ранние версии вернули регулярный кортеж , но было бы очень легко модифицировать соответствующим образом. Вот версия, которая работает со старыми (и более новыми) версиями:

import inspect
def get_default_args(func):
    """
    returns a dictionary of arg_name:default_values for the input function
    """
    args, varargs, keywords, defaults = inspect.getargspec(func)
    return dict(zip(args[-len(defaults):], defaults))

Подумайте об этом:

    return dict(zip(reversed(args), reversed(defaults)))

также будет работать и может быть более интуитивным для некоторых людей .


70
ответ дан mgilson 19 August 2018 в 08:23
поделиться
  • 1
    @ Tadeck - я должен был поддержать вас. Я просто догадывался, как их можно объединить, пока я не увижу твое сообщение, которое подтвердило мои подозрения. – mgilson 27 September 2012 в 18:52
  • 2
    @ Tadeck вы могли бы объяснить, как это работает? Я немного озадачен тем, что происходит. – skyler 27 September 2012 в 18:57
  • 3
    @skyler - знаете ли вы функцию zip? Какую часть вы не понимаете. Я с удовольствием улучшу ответ, если вы скажете мне, что вас смущает. – mgilson 27 September 2012 в 19:00
  • 4
    @mgilson Я думаю, что я понял это сейчас. Аргументы со значениями по умолчанию не могут быть перемежены с помощью аргументов без значений по умолчанию, поэтому сопоставление значений по умолчанию в списке аргументов, начиная с последнего аргумента и перемещения назад, правильно соединяет их. – skyler 27 September 2012 в 19:02
  • 5
    @skyler - Точно. Я не мог бы сам это сказать. – mgilson 27 September 2012 в 19:03

Вы можете использовать модуль inspect со своей getargspec функцией :

inspect.getargspec(func)

Получить имена и значения по умолчанию аргументов функции Python. Возвращается tuple из четырех вещей: (args, varargs, keywords, defaults). args - список имен аргументов (он может содержать вложенные списки). varargs и keywords - имена аргументов * и ** или None. defaults является кортежем значений аргументов по умолчанию или None, если нет аргументов по умолчанию; если этот кортеж имеет элементы n, они соответствуют последним n элементам, перечисленным в args.

См. ответ mgilson для точного кода о том, как для получения имен аргументов и их значений по умолчанию.

6
ответ дан Community 19 August 2018 в 08:23
поделиться

, чтобы ухаживать только за ключевыми словами args (а потому, что значения по умолчанию и kwonlydefaults могут быть None):

spec = inspect.getfullargspec(func)
defaults = dict(zip(spec.args[::-1], (spec.defaults or ())[::-1]))
defaults.update(spec.kwonlydefaults or {})
1
ответ дан gnr 19 August 2018 в 08:23
поделиться
  • 1
    Ага. +1 для указания этого. Мой оригинальный ответ был написан до того, как python3.x был всем, что было популярно. Оказывается, есть даже способ better справиться с этим теперь с объектами Signature (который я добавил к моему первоначальному ответу) – mgilson 25 August 2017 в 01:23

В python все аргументы со значением по умолчанию появляются после аргументов без значения по умолчанию. Поэтому отображение должно начинаться с конца, пока вы не исчерпаете список значений по умолчанию. Следовательно, логика:

            dict(zip(reversed(args), reversed(defaults)))

дает правильно отображенные значения по умолчанию.

1
ответ дан Seraj Ahmad 19 August 2018 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: