Динамически Изменить Python Метод и Аргументы - PullRequest
5 голосов
/ 17 апреля 2020

Я использую Python, и я получаю определение от конечной точки REST параметров здесь:

https://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Network/ESRI_DriveTime_US/GPServer/CreateDriveTimePolygons?f=json

Что я хочу сделать имеет следующий вид:

  1. Создайте функцию с именем: CreateDriveTimePolygons
  2. Добавьте входные параметры
  3. ссылаются на функцию в классе, которая может обрабатывать эти входные данные.
OnlineMethod(above_url).CreateDriveTimePolygons(Input_Location=(25,-34), Drive_Times="5,12,31")

Я могу использовать setattr на объекте, чтобы определить готовую функцию, но у меня следующий вопрос:

  1. Как изменить имя подписи метод?
  2. Как изменить входные параметры метода?

Спасибо

Цель состоит в том, чтобы не использовать kwargs или args

Ответы [ 4 ]

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

Я думаю, вы можете попробовать Metaclass в Python.

https://realpython.com/python-metaclasses/#defining -a-class-динамически

0 голосов
/ 30 апреля 2020

Я думаю, что решил подобную проблему. Когда я работал над версиями API

, например, если запрос пользовательского агента содержит v1 в параметрах URL, инициализируйте API-интерфейсы v1 / классы менеджера или v2 и т. Д.

Для таким образом, мы можем использовать частичную реализацию на шаблоне адаптера , создав карту для набора классов / методов в вашем случае.

class OnlineMethod(object):
    ...
    def __init__(self, url):
        pass

    def create_drive_time_polygons(self, *args, **kwargs):
        pass

    ...

action_method_map = {
    'CreateDriveTimePolygons': OnlineMethod().create_drive_time_polygons,
}


action_method_map['CreateDriveTimePolygons'](Input_Location=(25,-34), Drive_Times="5,12,31", Output_Drive_Time_Polygons=[1,2,3])


action_method_map[action_from_url](Input_Location, Drive_Times, Output_Drive_Time_Polygons)

Имеет ли это смысл?

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

Вы всегда можете использовать ~ молоток для фиксации микроскопа ~ eval или exec для динамической записи Python кода. Но в этом случае вы будете иметь гораздо большую ответственность за предотвращение ошибок.

class A:
  def __init__(self):
    pass

A.some_method = lambda self, x: print(x ** 2)

a = A()
a.some_method(20)  # 400

args = ['x', 'y', 'z']
A.new_method = eval(f'lambda self, {", ".join(args)}: print(sum([{", ".join(args)}]))')
a.new_method(1, 2, 3)  # 6
0 голосов
/ 17 апреля 2020

Для пункта 2, если под модификацией вы подразумеваете передачу переменного числа аргументов / параметров, вы можете обратиться по этой ссылке:

https://www.geeksforgeeks.org/args-kwargs-python/

Если по изменить, то есть изменить значения, передаваемые в функцию, тогда вы можете просто сохранить значения в переменных и передать эти переменные в качестве аргументов / параметров в метод.

...