Как я могу отделить свой файл Python до нескольких плагинов?

Поэтому, прежде всего, я хочу сказать: я изучал модули и т. Д., Я просто не знаю, как я переписал бы это, чтобы соответствовать этому.

Проект: у меня есть Skype Bot с помощью модуля Skype4Py. У меня около 11 команд, я заметил, что один скрипт становится немного большим.

Я пытаюсь подумать о том, как связать один файл main.py с Панели плагинов, который содержит каждую ботовую функцию в собственном респектабельном файле Python. Звучит просто все, кроме случаев, когда речь идет о функции.

Вот только основной взгляд на мой бот Skype, пропуская некоторые из более крупных функций.

import Skype4Py, random class SkypeBot(): def __init__(self): self.skype = Skype4Py.Skype() if self.skype.Client.IsRunning == False: self.skype.Client.Start() self.skype.Attach() self.results = ['Yes', 'No', 'Maybe', 'Never'] def main(self): print ' Skype Bot currently running on user: %s' % self.skype.CurrentUserHandle print "\n\nCommands Called:\n" while True: self.skype.OnMessageStatus = self.RunFunction def RunFunction(self, Message, Status): if Status == 'SENT' or Status == 'RECEIVED': cmd = Message.Body.split(' ')[0] if cmd in self.functions.keys(): self.context = Message self.caller = self.context.FromHandle self.functions[cmd](self) def ping(self): print " %s : Ping" % self.caller self.context.Chat.SendMessage('Pong') def say(self): try: response = self.context.Body.split(' ', 1) if response[1] == "-info": print " %s : say -info" % self.caller self.context.Chat.SendMessage("Resends the message entered. \n" "Usage: !say Hello. \n" "Example: Bot: Hello.") else: say = response[1] print " %s : Say [%s]" % (self.caller, say) self.context.Chat.SendMessage(say) except: self.context.Chat.SendMessage("Please use -info to properly use the !say command") def eightball(self): try: question = self.context.Body.split(' ', 1) if question[1] == "-info": print " %s : 8Ball -info" % self.caller self.context.Chat.SendMessage("Responds with an answer.\n" "Usage: !8ball 'Do I have swag?'\n" "Example: !8Ball Response: 'Yes'") else: random.shuffle(self.results) answer = self.results[3] print " %s : 8Ball [%s]" % (self.caller, question[1]) self.context.Chat.SendMessage("!8Ball Response: %s" % answer) except: self.context.Chat.SendMessage("Please use -info to properly use the !8ball command") #FUNCTIONS LIST #******************** functions = { "!ping": ping, "!say": say, "!8ball": eightball, } if __name__ == "__main__": snayer = SkypeBot() snayer.main() 

Итак, в основном, что мне интересно, как я могу изменить

 self.skype.OnMessageStatus = self.RunFunction 

так что он будет запускать функции из другого файла?

    One Solution collect form web for “Как я могу отделить свой файл Python до нескольких плагинов?”

    Для программы такого размера нет необходимости вставлять свои командные функции в отдельные файлы, но я думаю, что это хорошая организация. И хорошая практика, когда вы пишете программу с тысячами строк кода. 🙂

    Один из способов сделать это – создать базовый класс SkypeBot без каких-либо командных методов, а затем импортировать методы команд из вашего каталога плагинов и добавить их в класс. Достаточно легко добавить новые атрибуты в существующий класс, и не имеет значения, являются ли новые атрибуты свойствами или методами, синтаксис для их добавления идентичен. (С небольшим количеством работы можно даже добавить новые атрибуты в экземпляр, поэтому вы можете иметь несколько экземпляров, каждый из которых имеет свой собственный набор команд. Но я думаю, что здесь не нужно, так как программа, использующая класс SkypeBot обычно будет создавать только один экземпляр).

    Поэтому мы можем разбить ваш вопрос на две части:

    1. Как добавить методы в существующий класс.
    2. Как импортировать эти методы из других исходных файлов.

    Как я уже сказал, 1) легко. 2) также довольно прост, но я никогда не делал этого раньше, поэтому мне пришлось провести немного исследований и испытаний, и я не могу обещать, что то, что я сделал, – это лучшая практика, но это работает. 🙂

    Я мало что знаю о Skype, и у меня нет этого модуля Skype4Py, и, как вы сказали, код выше не является полной программой, поэтому я написал довольно простой код, чтобы проиллюстрировать процесс добавления методов плагина от отдельных файлов до существующего класса.

    Название основной программы – «plugin_demo.py». Чтобы сохранить что-то опрятное, он живет в своем собственном каталоге «plugintest /», который вы должны создать где-нибудь на своем пути Python (например, где вы обычно держите свои программы на Python). Этот путь должен быть указан в переменной среды PYTHONPATH.

    «plugintest /» имеет следующую структуру:

     plugintest/ __init__.py plugin_demo.py plugins/ __init__.py add.py multiply.py 

    Файлы __init__.py используются машиной import Python, чтобы сообщить, что каталог содержит пакет Python, см. 6.4. Пакеты в документах Python для более подробной информации.

    Вот содержимое этих файлов. Во-первых, файлы, которые входят в «plugintest /»:

    __init__.py

     __all__ = ['plugin_demo', 'plugins'] from plugintest import * 

    plugin_demo.py

     #! /usr/bin/env python #A simple class that will get methods added later from plugins directory class Test(object): def __init__(self, data): self.data = data def add_plugins(cls): import plugins print "Adding plugin methods to %s class" % cls.__name__ for name in plugins.__all__: print name plug = getattr(plugins, name) print plug method = getattr(plug, name) print method setattr(cls, name, method) print print "Done\n" add_plugins(Test) def main(): #Now test it! t = Test([1, 2, 3]); print t.data t.multiply(10); print t.data t.add(5); print t.data if __name__ == '__main__': main() 

    И теперь содержимое каталога «plugintest / plugins /»:

    __init__.py

     __all__ = ['add', 'multiply'] from plugintest.plugins import * 

    add.py

     #A method for the Test class of plugin_demo.py def add(self, m): self.data = [m + i for i in self.data] 

    multiply.py

     #A method for the Test class of plugin_demo.py def multiply(self, m): self.data = [m * i for i in self.data] 

    Если вы подключитесь к каталогу, содержащему папку «plugintest /», вы сможете запустить его с помощью

    python plugintest/plugin_demo.py

    и если вы используете cd для «plugintest /»

    python plugin_demo.py

    Кроме того, в интерпретаторе (или другой программе Python) вы должны быть в состоянии сделать

    import plugintest

    а затем запустите функцию main() функции "plugin_demo.py" с помощью

    plugintest.plugin_demo.main()

    Другие обычные варианты from ... import ... т. Д. Также должны работать, как ожидалось.

    Функция «plugin_demo.py», которая выполняет магию добавления импортированных методов в класс Test представляет собой add_plugins() . Когда он запускается, он печатает имя метода, его модуль и его функцию. Это может быть полезно во время разработки, но вы, вероятно, будете комментировать некоторые из этих заявлений на печать после правильной работы программы.

    Надеюсь, это поможет, и если у вас возникнут вопросы, пожалуйста, не стесняйтесь спрашивать.

    Python - лучший язык программирования в мире.