У меня есть дизайн библиотеки Python, который я пытаюсь очистить, но я заметил, что одна часть не выполняет автозаполнение в Eclipse / PyDev. Я достаточно знаком, чтобы это не было для меня проблемой, но это библиотека, которую другие в конечном итоге будут использовать, и автозаполнение, которая не работает для блока функций, не подойдет.
Я просто быстро объясню, что он пытается сделать, я заново создал дизайн ниже. Это все работает, но автозаполнение не полезно. Может быть, кто-то может просто привести меня в порядок.
В модуле test_module2.py
import Main from test_module.py
from test_module import Main
class Second(object):
_main = Main
def set_main_variable(self, var):
self._main.variable = var
В модуле test_module.py
import sys
class Main(object):
variable = 0
second = None
def __init__(self):
for x in sys.modules.keys():
if x.endswith("test_module2"):
y = sys.modules[x]
self.second = y.Second()
self.second._main = self
def print_variable(self):
print self.variable
В приложении test.py
import test_module
import test_module2
if __name__ == "__main__":
m = test_module.Main()
m.second.set_main_variable(10)
m.print_variable() # prints 10
При этом, если модуль test_module2.py импортирован, вы можете получить к нему доступ через отдельную переменную-член пространства имен Main.second. Хранит вещи отдельно, и если модуль недоступен, то у вас нет доступа к функциям Second.
В test_module2.py, Main импортируется (вы не можете использовать Second без Main в любом случае), а _main по умолчанию - Main. Это позволяет автоматически завершать в Second, когда вы работаете с родительской ссылкой _main, которая настраивается, когда создается Main, а Second импортируется. (это хорошо)
В Main, Second является необязательным и никогда не вызывается напрямую из методов Main. Так что автозаполнение не обязательно. (это нормально)
В __main__ автозаполнение естественным образом работает для переменных и методов члена Main, но не работает с m.second. Я не могу по умолчанию использовать m.second, потому что мне пришлось бы импортировать test_module2.py из test_module.py. Это необязательно и определяется импортом __main __ test_module2.py. например если __main__ импортирует test_module2.py, то Second автоматически становится доступным для приложения.
У кого-нибудь есть лучший способ добавить опционально импортированную конструкцию модуля / класса в переменную-член, которая будет работать с автозаполнением IDE?
Заранее спасибо за любые идеи.
Я собираюсь прийти к выводу, что автозаполнение с помощью PyDev будет видеть переменную, установленную для членов класса, только если родительский класс наследует от него, или по умолчанию переменная равна самому классу. . Например:
class Main(object):
second = Second
Затем в __main__ вы можете выполнить автозаполнение: main.second ...
Тот или Мейн должен наследовать от Второго.
Хорошо, мне нужно вернуться и жаловаться, что этот дизайн библиотеки не будет работать с автозаполнением IDE. Посмотрим, смогу ли я использовать класс-обертку для наследования, если присутствует импорт test_module2, и очистить вещи.
Мое решение:
Вот что я придумал:
В модуле test_module2.py
import test_module
class Second(object):
_variable = 0 # overrided by Main's _variable
def set_main_variable(self, var):
self._variable = var
class Main(test_module.Main, Second):
def __init__(self):
super(Main, self).__init__()
В модуле test_module.py
class Main(object):
_variable = 0
second = None
def __init__(self):
super(Main, self).__init__()
def print_variable(self):
print self._variable
сейчас! В test.py, если вы импортируете test_module или test_module2 (не оба), вы можете создать Main с добавленной функциональностью Second или без нее. Второй будет иметь доступ ко всему в Main, и поскольку Main наследует Second, автозаполнение работает.
В приложении test.py
#import test_module
import test_module2
if __name__ == "__main__":
m = test_module.Main()
m.set_main_variable(10)
m.print_variable() # prints 10
Я не знаю, смогу ли я легко переместить методы Second в подпространство имен, например Main.second.set_variable (). Мне бы пришлось явно установить ссылку Main в Second после того, как Main создаст ее как переменную (в Main init, self.second = Second ()) и не иметь Second, унаследованного от Main. Затем вы можете вызвать m.second.set_main_variable (10) и оставить все методы Second доступными из Main в пространстве имен .second.