programing

모듈을 가져왔는지 확인하려면 어떻게 해야 합니까?

telecom 2023. 10. 2. 10:59
반응형

모듈을 가져왔는지 확인하려면 어떻게 해야 합니까?

코드 어딘가에 모듈을 가져왔는지 확인하려면 어떻게 해야 합니까?

 if not has_imported("somemodule"):
     print('you have not imported somemodule')

모듈을 이미 가져온 것인지 확인하고 싶은 이유는 가져오기 싫은 모듈이 있기 때문입니다. 왜냐하면 프로그램이 엉망이 되는 경우가 있기 때문입니다.

사전에 있는 모듈 이름에 대한 테스트:

import sys

modulename = 'datetime'
if modulename not in sys.modules:
    print 'You have not imported the {} module'.format(modulename)

설명서에서:

모듈 이름을 이미 로드된 모듈에 매핑하는 사전입니다.

문장은 다음 두 가지를 수행합니다.

  1. 모듈을 이전에 가져온 적이 없는 경우(==에 없음)sys.modules), 그런 다음 로드되어 에 추가됩니다.sys.modules.
  2. 모듈 개체를 참조하는 현재 네임스페이스의 이름 또는 모듈 네임스페이스의 멤버인 개체에 하나 이상의 이름을 바인딩합니다.

표정이modulename not in sys.modules1단계가 이루어졌는지 테스트합니다.2단계의 결과를 테스트하려면 정확한 것이 무엇인지 알아야 합니다.import서로 다른 개체를 참조하기 위해 서로 다른 이름을 설정할 때 statement가 사용되었습니다.

  • import modulename놓다modulename = sys.modules['modulename']
  • import packagename.nestedmodule놓다packagename = sys.modules['packagename'](추가 레벨 수에 관계없이)
  • import modulename as altname놓다altname = sys.module['modulename']
  • import packagename.nestedmodule as altname놓다altname = sys.modules['packagename.nestedmodule']
  • from somemodule import objectname놓다objectname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulename놓다nestedmodulename = sys.modules['packagename.nestedmodulename'](이름이 지정된 개체가 없을 때만)nestedmodulename에서packagename이 가져오기 전에 네임스페이스, 중첩된 모듈에 대한 추가 이름이 이 시점에서 상위 패키지 네임스페이스에 추가됨)
  • from somemodule import objectname as altname놓다altname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulename as altname놓다altname = sys.modules['packagename.nestedmodulename'](이름이 지정된 개체가 없을 때만)nestedmodulename에서packagename이 가져오기 전에 네임스페이스, 중첩된 모듈에 대한 추가 이름이 이 시점에서 상위 패키지 네임스페이스에 추가됨)

가져온 개체가 바인딩된 이름이 지정된 네임스페이스에 있는지 테스트할 수 있습니다.

# is this name visible in the current scope:
'importedname' in dir()

# or, is this a name in the globals of the current module:
'importedname' in globals()

# or, does the name exist in the namespace of another module:
'importedname' in globals(sys.modules['somemodule'])

이것은 이름이 존재(바운드됨)하는 것만 알려줄 뿐, 해당 모듈의 특정 모듈이나 개체를 지칭하는 것은 알려주지 않습니다.추가로 해당 개체를 검사하거나 에서 사용 가능한 개체와 동일한 개체인지 테스트할 수 있습니다.sys.modules, 이름이 그 이후로 완전히 다른 것으로 설정된 것을 제외해야 할 경우.

sys.modules 답변이 수락됨에 따라 가져올 때 모듈 이름을 변경하는 데 주의해야 할 사항을 하나 추가합니다.

>>> import sys
>>> import datetime as dt
>>> 'dt' in sys.modules
False
>>> 'datetime' in sys.modules
True

sys.modules를 사용하여 모듈을 가져오는지 테스트합니다(유니코드 데이터를 예로 사용합니다).

>>> import sys
>>> 'unicodedata' in sys.modules
False
>>> import unicodedata
>>> 'unicodedata' in sys.modules
True

sys.modules는 인터프리터의 현재 인스턴스에서 사용되는 모든 모듈을 포함하므로 다른 Python 모듈로 가져올 경우 표시됩니다.

dir()이름이 현재 네임스페이스에 정의되었는지 여부를 확인합니다.

둘의 의 분리된하며 하며, 하지 않은 한 .copy네 자신.

if ('copy' in sys.modules) and ('copy' in dir()):

용도:

if "sys" not in dir():
  print("sys not imported!")

코드의 처음(위)에서는 잘 작동하지만, 이름이 sys인 다른 개체가 생성될 경우 주의 깊게 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/30483246/how-can-i-check-if-a-module-has-been-imported

반응형