Вставьте функцию в список с аргументами и используйте их - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть такой параметр: params={ 'arg1':'a', 'arg2:'b', 'funcList':['x','y','z']}

Как правильно вставить их в функцию, чтобы ее можно было вызывать так:

func(x(a,b),y(a,b),z(a,b))

возможно, мне нужно сопоставить исначала распакуйте их, но как это сделать по-питонски?

РЕДАКТИРОВАТЬ II:

Вот изображение более случая:

def X(a,b): # could be more args
   print(a+b)

def Y(a,b): # could be more args
   print(a*b)

# etc more funcs with identical args

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

def func(X,Y): # or maybe with *args?
   print("args delivered")

И вызов func может быть таким:

func(X(1,2),Y(1,2)) # X's and Y's arguments are always identical

Все это коренится из одних данных,

params={
'a' :1,
'b' :2,
'funcList':['x','y']}

Результат:

2
2
args delivered

Спасибо.

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018
params={
   'arg1':'a',
   'arg2':'b',
   'funcList':['x','y','z']
}

result = func(*[
    eval(f)(*[arg for key, arg in sorted(list(params.items())) if key != 'funcList'])
    for f in params['funcList']
])
0 голосов
/ 13 декабря 2018

Я дал кредит @rassar за идеи, и я просто положу здесь, чтобы представить разбивку и то, что на самом деле происходит для тех, кто все еще невежествен (как и я):

from itertools import chain # just for showing purpose

params={'arg1':'a','arg2':'b','arg3':'c','funcList':['A','B']}

def A(*args):
  yield f'{args[-1]}' + f'{args[0]}'

def B(*args):
  yield f'{args[0]}' + f'{args[-1]}'

list(chain(A('a','b','c'),B('a','b','c'))) # my intention with params
# result: ['ca', 'ac']

# could also be expressed with creating a new tuple:

toCall=(A('a','b','c'),B('a','b','c'))

# and use it like so:

list(chain(*toCall))
# result: ['ca', 'ac']

С @ rassar's:

def call(params):
    p = params.copy()
    return map(lambda i: eval(i)(*p.values()), p.pop("funcList"))

list(chain(*call(params)))
0 голосов
/ 12 декабря 2018

Это должно работать:

def call(params):
    p = params.copy()
    return map(lambda i: i(*p.values()), p.pop("funcList"))

Пример использования:

>>> x = lambda arg1, arg2, arg3: arg1 + arg2 + arg3
>>> params={'arg1':'a', 'arg2':'b', 'arg3': 'c', 'funcList':[x]}
>>> list(call(params))
['abc’]

Тогда вы можете вызывать свою функцию следующим образом:

>>> f = lambda i: print(i)
>>> f(*call(params))
abc

Если значения вparams[“funcList”] являются строками, а не фактическими функциями, вам нужно добавить eval к call:

def call(params):
    p = params.copy()
    return map(lambda i: eval(i)(*p.values()), p.pop("funcList"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...