python 프로그래밍 기초(3): 패키지, 모듈 가져오기 및 Django 관련 소스 코드

요 며칠 동안 django의 원본 코드를 봤는데 가방/모듈의 도입 부분에 대해 잘 몰라요. 이쪽은 Django 원본 코드를 결합시켜 이해와 기록을 해보세요~
디렉토리:
1. 모듈 속성:name__
2. 동적 모듈 가져오기:import__() 및 importlib.import_module()
3. 가방의 디렉터리 구조 &init__.py 파일
참조:
  • Django 소스 코드
  • python 잡담:init__.py의 역할(https://www.cnblogs.com/tp1226/p/8453854.html)

  • ----------------------------------------------------------------------------------------------------------------------------------------------------------
    1. __name__
    모듈 b에서 직접 실행된 출력 결과는 모듈의 를 통해 알 수 있습니다name__속성은 어느 것이 가져온 모듈이고, 어느 것이 직접 실행 모듈인지 알 수 있다.
    #   ./a.py
    print("hello world")
    
    #    ./b.py
    import a
    print(a.__name__)
    print(b.__name__)
    
    #   b            :
    hello world
    a            #a     
    __main__     #b       

    2. __import__() 및 importlib.import_module()
    둘 다 동적 가져오기 모듈(런타임 가져오기)을 실현할 수 있지만import__() 첫 번째 디렉토리만 가져올 수 있습니다.
    __import__(): 모듈 자체의 속성 방법이 아닌 시스템에서 제공하는 함수
    #   : b.py
    
    __import__('sys')      #    import sys
    print(dir(b))          #  dir()    b      __import__()  
    

    동적 가져오기 모듈: importlib, Django의 소스 코드에서 다음을 볼 수 있습니다.
    예1: 데이터베이스 이전을 하고 있을 때:python 관리자.py migrate;또는 서버를 시작할 때:python 관리자.py runserver; 중간에 많은 걸음을 지나 로드에 도달한다command_class () 함수입니다.django/core/management/commonds 폴더 밑에 많습니다.py 파일, 그중에migrete.py와runserver.py; 데이터베이스 마이그레이션과 데이터베이스의 시작은 두 파일의 Command()를 실행하는 것입니다.
    #    ./django/core/management/__init__.py
    def load_command_class(app_name, name):    #app_name='django.core'  name=migrate/runserver
        module = import_module('%s.management.commands.%s' % (app_name, name)) 
        return module.Command()    #module='migrate.py'  ‘runserver’..  ..        

    예2: 코드를 보지 않았으니 먼저 건너뛰자
    #   ./django/core/management/manage.py
    
    import_module('.management', app_config.name)
    #import_module     
    #def import_module(name, package=None)

    3. 가방의 디렉터리 구조 &init__.py 파일
  • __init__초기화 모듈입니다.from-import 문구가 하위 패키지를 가져올 때 사용해야 합니다.사용하지 않으면 빈 파일
  • 이 될 수 있습니다.
    '''
    a.py
       __init__.py                #  __init__.py,         
       b.py
            __init__.py           #  __init__.py,         
            c.py
    '''
  • 패키지를 가져올 때 패키지 아래의init__.py가 자동으로 실행됩니다. 
  • #    ./a.py
    import pack_b.b     #      : ‘pcak_b/b.py’    'pack_b.__init__.py'
    
    #    ./pack_b/b/py
    print('pack_b/b.py')
    
    #    ./pack_b/__init__.py
    print('pack_b.__init__.py')
  • Django 소스 코드 예: apps 객체 호출 getapp_configs () 방법
  • #    ./django/core/management/__init__.py
    
    from django.apps import apps   #        apps  ,   apps  ,   from django.apps.registry import apps
    def get_commands():
        #.....      ........
        for app_config in reversed(list(apps.get_app_configs())):    #  apps   get_app_configs()  
            path = os.path.join(app_config.path, 'management')
            commands.update({name: app_config.name for name in find_commands(path)})
        return commands

    다음 단계는 기본적으로django를 실행합니다.apps 패키지 아래init__.py, 파일 코드는 다음과 같습니다.
    # 파일./django/apps/__init__.py
    from .config import AppConfig
    from .registry import apps          #     ,     from django.apps import apps
    
    __all__ = ['AppConfig', 'apps']     #   from django.apps import *
      ,  registry.py  
    #   ./django/apps/registry.py
    class Apps:
    #....      .........
    def get_app_configs(self):
        self.check_apps_ready()
        return self.app_configs.values()
    
    apps = Apps(installed_apps=None)        #      ,   

    좋은 웹페이지 즐겨찾기