Как дополнительно импортировать / конструировать класс в переменную-член, которая будет поддерживать автозаполнение IDE - PullRequest
0 голосов
/ 02 сентября 2011

У меня есть дизайн библиотеки 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.

1 Ответ

0 голосов
/ 02 сентября 2011

Во-первых, Простое лучше, чем сложное - ваш дизайн кажется сложным без веской причины. Может быть, вы должны предоставить некоторые сведения о вашей фактической библиотеке.

Во-вторых, с Python как с динамически типизированным языком вполне естественно, что есть случаи, когда ваша IDE не может автоматически завершиться, потому что ваша IDE имеет статическую перспективу. И вам определенно не следует программировать, чтобы приспособить возможности вашей IDE.

...