Nano Hash - криптовалюты, майнинг, программирование

Как использовать *args в питоне

У меня есть функциональный модуль, в котором есть некоторые функции с некоторыми общими входными данными, а также другие, специфичные для них. например

def func_a(time_series, window ='1D'):

def func_b(time_series, window ='1D', availability_history ): 

def func_c(time_series, window ='1D', max_lag=25, use_probability ='T'):

Я пытаюсь запустить эти функции в цикле следующим образом:

func_list = [func_a, func_b, func_c]
windows = ['1D', '5D']
params = ['', hist, (25, 'T')]

for i_func, func in enumerate(func_list):
    class_obj = class_X(A,B,func)

    for window in windows:
        args = (window, params[i_func]) # params is a list or tuple of other params for funcs e.g. 
        class_obj.run_func(args)

И в другом модуле

class class_X(object):
    def __init__(self, a, b, func_to_run):
        self.a = a
        self.ts = b
        self.method = func_to_run

    def generate_output(self, *args):
        return self.method(self.ts, args) # time series is common and fixed for all, other params differ or change

Приведенный выше код не будет работать, потому что я думаю, что функции, которые я вызываю, должны быть изменены, чтобы использовать *args, а не фиксированные определенные параметры.

Я думаю, что *args предназначен для функций, в которых количество входных параметров неизвестно, но я пытаюсь использовать его в случае, когда количество входных параметров известно, но варьируется для разных функций в цикле.

Есть ли какое-либо исправление для этого, когда мне не нужно изменять модуль функций и я могу передать все необходимые параметры как один объект (e.g. list or tuple)?

РЕДАКТИРОВАТЬ-

В ответе macromoonshine я могу использовать kwargs следующим образом:

def generate_output(self, **kwargs):
    return self.method(self.ts, kwargs)

С этой модификацией вы можете вызывать generate_outputs() следующим образом:

x.generate_outputs( window ='1D', max_lag=25, use_probability ='T')

где xi экземпляр вашего класса X

Можно ли это улучшить, чтобы я мог передавать аргументы, отличные от time_series и window, в качестве значения поиска в цикле, например.

x.generate_outputs( window ='1D', params[iloop])

куда

params[iloop] = max_lag=25, use_probability ='T'

Я пытался сделать это:

params = (30, "F")
x.generate_outputs( window, *params)

но получить ошибку

TypeError: generate_output() takes 1 positional argument but 4 were given

  • искать аргументы ключевого слова. **kwargs 11.11.2017

Ответы:


1

Вместо этого вы можете использовать **kwargs, что позволяет использовать произвольные параметры ключевого слова. Это должно быть проще, чем перебирать каждую функцию. Вам нужно просто изменить метод generate_outputs() в коде:

def generate_output(self, **kwargs):
    return self.method(self.ts, kwargs)

С этой модификацией вы можете вызывать generate_outputs() следующим образом:

x.generate_outputs(time_series, window ='1D', max_lag=25, use_probability ='T')

где xявляется экземпляром вашего класса X.

Если вы хотите передать kwargs из dict вместо именованного параметра, вы должны добавить к переменной словаря префикс **. Адаптированный код должен выглядеть так:

params = [{max_lag: 35, use_probability: 'F'}, ... ]
TS= [1,2,3,4]

for i_func, func in enumerate(func_list):
    class_obj = class_X(TS, func)
    for window in windows:
        req_args = dict(params[i_func])
        req_args['window'] = 0
        class_obj.generate_output(**req_args)
11.11.2017
  • Спасибо, как я могу передать аргументы, отличные от time_series и window, как то, что я ищу через список/кортеж и т. д., например. x.generate_outputs(time_series, window ='1D', params [i]) где params[i] = max_lag=25, use_probability ='T' 12.11.2017
  • Извините, вы правы. Я адаптировал свой пост для этого. 12.11.2017
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..