Я знаю, как передать функцию в качестве аргумента, а затем использовать функцию позже. Однако я не мог понять, как это сделать с помощью метода. Я хотел бы предоставить пользователям API, который позволяет им настраивать пользовательские функции.
В качестве (не) рабочего примера, скажем, я хочу, чтобы пользователь мог предоставить некоторую общую функцию pandas:
import pandas as pd
# user-supplied data
right = pd.DataFrame({'right_a':[1,2],
'right_b':[3,4]})
# user-supplied function & arguments
myfun = pd.DataFrame.merge
args = {'right':right,
'right_on':'right_a',
'how':'inner'
}
user_configs = {'func': myfun,
'args':args}
def exec_func(exec_dict):
# some data that only the function knows:
left = pd.DataFrame({'left_a':[1,2],'left_b':['foo','bar']})
# some args that only the function knows
exec_dict['args']['left_on'] = 'left_a'
# apply the function
#result = left.merge(**exec_dict['args']) # desired result
result = left.exec_dict['func'](**exec_dict['args']) # generalized but not working code
return result
exec_func(user_configs)
приведенный выше код приводит к
AttributeError: 'DataFrame' object has no attribute 'exec_dict'
по понятным причинам. Как я могу добиться желаемого поведения, которое позволяет пользователю предоставлять различные функции?
myfun = 'merge'
, а затемresult = getattr(left, exec_dict['func'])(**exec_dict['args'])
. - person mportes   schedule 04.11.2020exec_dict['func']
напрямую и укажитеleft
в качестве первого аргумента, то естьexec_dict['func'](left, **exec_dict['args'])
. - person mportes   schedule 04.11.2020pandas
и нескольких словарей излишне усложняет ситуацию как для нас, и для вас. - person MisterMiyagi   schedule 04.11.2020