Python에서 플러그인 아키텍처 생성

플러그인 아키텍처가 필요한 일부 사용 사례가 있습니다. 나는 이것을 "코드"플러그인이라고 부르지만 이미 해당 단어가 있을 가능성이 큽니다. 아이디어는 런타임에 인스턴스에 대한 참조를 가질 수 있도록 동적으로 생성된 함수 또는 클래스를 '로드'하는 것입니다. 나는 __subclasses__ 던더 방법을 사용하는 문제와 데코레이터를 사용하는 문제에 대해 2개의 솔루션을 만들었습니다.

솔루션 1



저장소: https://github.com/syrull/plugin-arch-python/tree/main/Solution-1

SOLUTION-1
│   configuration.py
│   main.py
│   README.md
│   setup.py
│
└───actions
        action_example1.py
        action_example2.py
        __init__.py

__subclasses__ 클래스의 BaseAction를 로드하고 '플러그 가능한' 클래스를 생성합니다. 작업은 configuration.py const의 ACTIONS 파일에서 지정할 수 있습니다. 이 방법은 djangoINSTALLED_APPS 방법에서 영감을 받았습니다.
call 메서드는 "작업"에 대한 자리 표시자입니다.

액션을 등록하려면


  • actions/ 폴더의 새 Python 파일
  • 적절한 이름으로 클래스 생성(예: ClickAction )
  • BaseAction로 클래스 확장
  • 모듈
  • 에 대한 적절한 경로와 함께 ACTIONS 파일에 있는 configuration.py const에 항목을 추가합니다.

    그 후 기능은 register 파일의 main.py에서 사용할 수 있습니다.

    $ python main.py
    [<class 'actions.action_example1.Example1Action'>, <class 'actions.action_example2.Example2Action'>]
    


    벤치마크




    Measure-Command { python .\main.py }
    
    Days              : 0
    Hours             : 0
    Minutes           : 0
    Seconds           : 0
    Milliseconds      : 24
    Ticks             : 240745
    TotalDays         : 2.78640046296296E-07
    TotalHours        : 6.68736111111111E-06
    TotalMinutes      : 0.000401241666666667
    TotalSeconds      : 0.0240745
    TotalMilliseconds : 24.0745
    


    솔루션 2



    저장소: https://github.com/syrull/plugin-arch-python/tree/main/Solution-2

    SOLUTION-2
    │   main.py
    │   README.md
    │   register.py
    │
    └───actions
            action_example1.py
            action_example2.py
            __init__.py
    


    이 솔루션의 이점은 데코레이터를 제어할 수 있고 일부 사용자 지정*args, **kwargs을 데코레이트된 함수에 전달할 수 있다는 것입니다.

    액션을 등록하려면


  • actions/ 폴더의 새 Python 파일
  • 적절한 이름으로 함수 생성(예: action_onclick )
  • register_action 데코레이터로 함수를 장식합니다.
  • __all__ 파일
  • actions/__init__.py 메서드에서 함수 내보내기

    그 후 기능은 register 파일의 main.py에서 사용할 수 있습니다.

    $ python main.py
    [<function action_example1 at 0x000001CC3F88D310>, <function action_example2 at 0x000001CC3F88D3A0>]
    


    벤치마크




    Measure-Command { python .\main.py }
    
    Days              : 0
    Hours             : 0
    Minutes           : 0
    Seconds           : 0
    Milliseconds      : 22
    Ticks             : 227803
    TotalDays         : 2.6366087962963E-07
    TotalHours        : 6.32786111111111E-06
    TotalMinutes      : 0.000379671666666667
    TotalSeconds      : 0.0227803
    TotalMilliseconds : 22.7803
    

    좋은 웹페이지 즐겨찾기