Помещение разделяет пакеты Python на то же пространство имен?

15
задан Taryn 25 June 2013 в 19:45
поделиться

4 ответа

там лучший способ выполнить это или возможно другой подход к вышеупомянутой проблеме распределения в целом?

Возможно. Установка модуля/пакета Python обычно хитра для подделки динамично как это, но ее объект/система классов открыт и расширяем четко определенным способом. Когда модули и пакеты не вполне имеют функций, необходимо инкапсулировать проект приятно, можно использовать классы вместо этого.

, Например, Вы могли иметь дополнительную функциональность в совершенно другом пакете, но позволить ей вводить классы в Вашу основную платформу через определенный интерфейс. например, myframework / _ †‹вЂ‹ _†‹init​ _†‹вЂ‹ _ .py содержащий основную обертку приложения:

class MyFramework(object):
    """A bare MyFramework, I only hold a person's name
    """
    _addons= {}
    @staticmethod
    def addAddon(name, addon):
        MyFramework._addons[name]= addon

    def __init__(self, person):
        self.person= person
        for name, addon in MyFramework._addons.items():
            setattr(self, name, addon(self))

Затем у Вас могла быть дополнительная функциональность в myexts/helloer.py, который сохраняет ссылку на ее 'владельца' или 'внешний' экземпляр класса MyFramework:

class Helloer(object):
    def __init__(self, owner):
        self.owner= owner
    def hello(self):
        print 'hello '+self.owner.person

import myframework
myframework.MyFramework.addAddon('helloer', Helloer)

Поэтому теперь просто "при импорте myframework" Вы только получаете основную функциональность. Но если Вы также "импортируете myexts.helloer", Вы также получаете способность назвать MyFramework.helloer.hello (). Естественно можно также определить протоколы для дополнений для взаимодействия с основным поведением платформы и друг другом. Можно также сделать вещи как внутренние классы, которые подкласс платформы может переопределить для настройки, не имея необходимость к классам патча обезьяны, которые могли бы влиять на другие приложения, если Вам нужен тот уровень сложности.

поведение Инкапсуляции как это может быть полезным, но это - обычно раздражающая работа для адаптации кода уровня модуля, который Вы уже получили для установки этой модели.

4
ответ дан 1 December 2019 в 04:27
поделиться

Это походит на то, что Вы, после может быть выполнен вполне аккуратно с рычагами импорта.

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

, Когда пакет, как находят, связан с загрузчиком (который может просто быть трудно кодирован к относительному пути при необходимости), он будет затем всегда использовать загрузчик для загрузки всех дополнений, например. Это имеет преимущество не требования любой игры PYTHONPATH, который обычно стоит сохранить максимально коротким.

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

[еще 115] информация о рычагах импорта может быть найдена здесь:

http://www.python.org/dev/peps/pep-0302/

0
ответ дан 1 December 2019 в 04:27
поделиться

Setuptools имеет способность к пакету поиска "точки входа" (функции, объекты, безотносительно) по имени. Trac использует этот механизм для , загружают его плагины , и он работает хорошо.

4
ответ дан 1 December 2019 в 04:27
поделиться
6
ответ дан 1 December 2019 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: