Python工程化小結


對如何寫一個工業級的Python項目作一個top-down小結。

一、項目結構

頂層結構:

文件夾:

  • model可以是項目中的自定義類;
  • utils是一些工程工具,比如log,tracker
  • log存放記錄的日志

py文件:

  • run:主文件,項目的頂層邏輯;
  • settings:run文件中的常量(用作設置);

二、package(包)

__init__.py作用:

  • 當文件夾下有__init__.py時,表示當前文件夾是一個package,其下的多個module統一構成一個整體。
  • 模糊導入:

    from Root.Pack1 import *

    模糊導入中的*中的模塊是由__all__來定義的,__init__.py的另外一個作用就是定義package中的__all__,用來模糊導入,如__init__.py:

    __all__ = ["Pack1Class","Pack1Class1"]

          或者

__all__ = ['file1','file2']   #package1下有file1.py,file2.py

借助__init__.py可以:將子文件中的類名導入到包名下

例如websocket包:websocket.WebSocketApp,外部在import的時候可以看到所有寫在__init__.py文件中的類名

 websocket包__init__.py文件內容:

websocket包_app.py中

 

三、類

如何寫callback(回調函數):

  • 1.在聲明處,將用於掛接外部函數的形參寫成帶默認參數的形式,比如on_message=None:
    def __init__(self, url, header=None,
                 on_open=None, on_message=None, on_error=None,
                 on_close=None, on_ping=None, on_pong=None,
                 on_cont_message=None,
                 keep_running=True, get_mask_key=None, cookie=None,
                 subprotocols=None,
                 on_data=None):
        """
        url: websocket url.
        header: custom header for websocket handshake.
        on_open: callable object which is called at opening websocket.
          this function has one argument. The argument is this class object.
        on_message: callable object which is called when received data.
         on_message has 2 arguments.
         ...
        """

 

  • 2. 類中需定義調用函數,檢測外部函數能否正常使用:
    def _callback(self, callback, *args):
        if callback:
            try:
                callback(self, *args)
            except Exception as e:
                _logging.error("error from callback {}: {}".format(callback, e))
                if _logging.isEnabledForDebug():
                    _, _, tb = sys.exc_info()
                    traceback.print_tb(tb)

 

  • 3. 調用時,通過定義的_callback來調用外部函數API
self._callback(self.on_message, data)  

 

給self綁定一個新屬性:

Python由於是動態語言,可以自由地綁定新屬性。但在類的方法中需要用hasattr檢查是否已存在,防止多次綁定。 

            if not hasattr(self, 'flop_strategy'):
                self.flop_strategy = FlopStrategy()

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM