Получение значений из общего статического класса между скриптами - PullRequest
0 голосов
/ 04 мая 2019

У меня есть основной сценарий со статическим классом, который импортирует другие сценарии и сохраняет их в формате dict в указанном классе.Цель этого класса - действовать как интерфейс между скриптами, позволяя им использовать класс для добавления функциональности в программу.В этом классе, в зависимости от некоторых событий, он вызывает некоторые функции в хранимых сценариях, но в этих сценариях они используют некоторые другие функции / переменные в классе из основного сценария.Я думал, что, будучи статическим классом, он будет делиться значениями своих атрибутов через все сценарии, но это не так.Попытка получить то есть Interface.scripts.get('foo').a_function() вызовет AttributeError, потому что в скриптах dict нет 'foo'.

Я уже выполнил свою задачу, не имея статических атрибутов и статических методов в классе и передавая единственный экземплярэто для скриптов функционирует как аргумент, , но (вот почему я это делаю), я хотел бы упростить код для меня и для всех, кто хочет писать скрипты, и просто с помощью простого from mainscript import Interface чтобы я мог использовать все классы интерфейса без проблем.


Вот резюме кода:

mainscript.py

import os
import importlib
class Interface:
    scripts = {}

    @staticmethod
    def init():
        """This function gets called when mainscript is run in terminal:
           python mainscript.py
        """
        for file in os.listdir("./scripts/"):
            if file.endswith(".py"):
                Interface.scripts[file[:-3]] = importlib.import_module(file)

    @staticmethod
    def some_event():
        Interface.scripts.get('bar').do_stuff()

    @staticmethod
    def print_stuff(some_arg):
        print('hello', some_arg)

    ...more code...

if __name__ == '__main__':
    Interface.init()
    Interface.run()  # some loop that handles events, so 'some_event' will be called eventually

bar.py

from mainscript import Interface

def do_stuff():
    Interface.print_stuff('me')
    Interface.scripts.get('foo').a_function()  # AttributeError, foo not in scripts

Та же ошибка может произойти в той же ситуации надругие скрипты.Обратите внимание, что проблема здесь заключается в совместном использовании памяти для сохраненных значений в атрибутах класса Interface (скажем, сценарии или любая другая переменная).

Итак, какие обходные пути можно сделать? Возможно ли иметь такой статическийпеременная (думая как в c #) ?, лучше я вернусь к тому, что у меня было раньше, без использования статического класса?

Это мой первый вопрос здесь, поэтому я надеюсь, что смогу объяснить ситуацию.Спасибо

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Я только что решил эту проблему, для всех, кто хочет знать:

Я переместил класс Interface в другой скрипт interface.py и из mainscript.py я импортирую интерфейсный класс, вот так:

mainscript.py

from interface import Interface

if __name__ == "__main__":
    Interface.init()
    Interface.run()

А в bar.py и других скриптах все остается прежним.

Таким образом, я гарантирую, что интерфейсный модуль импортируется в mainscript только один раз, поэтому такие скрипты, как bar.py, могут импортировать интерфейс без сброса переменных класса интерфейса (или чего бы то ни было)

0 голосов
/ 04 мая 2019

Обратите внимание, что то, что вы сохраняете в качестве ключа в словаре сценариев, включает в себя расширение .py, просто удалите его.

Interface.scripts[file[:-3]] = importlib.import_module(file)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...