직접 롤링하지 않으려면 pydoc
모듈에서 정확히 다음과 같은 기능을 수행 할 수 있습니다 .
from pydoc import locate
my_class = locate('my_package.my_module.MyClass')
여기에 나열된 다른 이상이 방법의 장점은이 locate
찾을 수 있는 직접 모듈 내에서 제공된 점으로 구분 된 경로에서 파이썬 객체뿐만 아니라 객체를. 예 my_package.my_module.MyClass.attr
.
그들의 레시피가 무엇인지 궁금하다면 다음과 같은 기능이 있습니다.
def locate(path, forceload=0):
"""Locate an object by name or dotted path, importing as necessary."""
parts = [part for part in split(path, '.') if part]
module, n = None, 0
while n < len(parts):
nextmodule = safeimport(join(parts[:n+1], '.'), forceload)
if nextmodule: module, n = nextmodule, n + 1
else: break
if module:
object = module
else:
object = __builtin__
for part in parts[n:]:
try:
object = getattr(object, part)
except AttributeError:
return None
return object
그것은 pydoc.safeimport
기능에 의존 합니다. 그에 대한 문서는 다음과 같습니다.
"""Import a module; handle errors; return None if the module isn't found.
If the module *is* found but an exception occurs, it's wrapped in an
ErrorDuringImport exception and reraised. Unlike __import__, if a
package path is specified, the module at the end of the path is returned,
not the package at the beginning. If the optional 'forceload' argument
is 1, we reload the module from disk (unless it's a dynamic extension)."""