Предоставление имен произвольных методов в классе Python для IDE для чтения - PullRequest
0 голосов
/ 07 мая 2018

Ситуация такая. Предположим, вы

from nastymodule import NastyObject1, NastyObject2, NastyObject3

и эти NastyObject имеют скрытую реализацию, которая не раскрывает свои методы из-за неразрывного лабиринта интерфейсов (COM, вызовы dll и тому подобное), поэтому IDE не может их предложить , Из документации вы читаете, что у NastyObject1 есть метод do_thing, у NastyObject2 есть метод do_other_thing, а на самом деле

NO1 = NastyObject1()
res = NO1.do_thing()
NO2 = NastyObject2()
res = NO2.do_other_thing()

отлично работает как задокументировано. Единственная проблема заключается в том, что, как я уже сказал, IDE не знает из-за неясной реализации этого метода do_thing или любых других методов этого класса. Теперь, по причинам, я должен написать уникальный NstObjWrapper класс для всех этих NastyObject, способных динамически выставлять эти методы.

Имейте в виду, что я уже написал NstObjWrapper __getattr__, так что

NOW1 = NstObjWrapper('NastyObject1')
res = NOW1.do_thing()
NOW2 = NstObjWrapper('NastyObject2')
res = NOW2.do_other_thing()

уже работает ; Мне нужно только найти способ динамически заставить IDE (и любой вид инспекторов классов) знать, что NOW1 имеет метод do_thing, а NOW2 имеет метод do_other_thing.

NstObjWrapper может быть, при необходимости, проинформирован о методах НастиОбъекта посредством исчерпывающего, жестко запрограммированного диктанта:

methods_dict = {'NastyObject1': ['do_thing', ......]
                'NastyObject2': ['do_other_thing', .......]
                'NastyObject3': [.......]}

Но поскольку класс должен иметь возможность обернуть все объекты, которые имеют разные методы, вы не можете просто определить методы с одинаковыми именами, а затем вызвать методы обернутого NastyObject.

Возможно ли это? Как бы вы это сделали?

1 Ответ

0 голосов
/ 07 мая 2018

Довольно простой способ решить эту проблему будет следующим:

class my_class_func():
    def do_thing():
        pass
    def func2():
        pass
    def func3():
        pass
    def func4():
        pass

С каждым функционалом, соответствующим одному из нужных вам функций, а затем сообщая IDE, что созданный вами класс имеет тип этого конкретного класса, как показано ниже:

NOW1 = NstObjWrapper('NastyObject1') # type: my_class_func
res = NOW1.do_thing()

Вы можете получить автозаполнение, поскольку способ написания комментария «type» соответствует правилам pep.

В любом случае, я не уверен, что это лучший путь.

...