dize

2012-05-27 19 views
9

olası Kopyaları gelen piton sınıf nesnesini alın:
Dynamic module import in Pythondize

Muhtemelen

basit bir soru! Bir ayar dosyasından geçen sınıfların (dizeler olarak) bir listesini yinelemem gerekiyor. sınıflar aşağıda gibi listelenmiştir:

TWO_FACTOR_BACKENDS = (
    'id.backends.AllowToBeDisabled', # Disable this to enforce Two Factor Authentication 
    'id.backends.TOTPBackend', 
    'id.backends.HOTPBackend', 
    #'id.backends.YubikeyBackend', 
    #'id.backends.OneTimePadBackend', 
    #'id.backends.EmailBackend', 
) 

Şimdi (tabii dışarı yorumladı sürece) bu sınıfların her birinde authenticate() işlevi çağırmak gerekir. Listede mutlu bir şekilde yineleniyorum, sadece foreach döngüsündeki dizeleri bir Class nesnesine nasıl dönüştüreceğimi bilmem gerekiyor, böylece authenticate yöntemini buna çağırabilirim. Bunu yapmanın kolay bir yolu var mı?

+0

Eğer '()' sınıflar çağrısında kimlik doğrulaması istiyorum ya da bu sınıfların nesneler üzerinde musunuz? – robert

+0

Özür dileriz, 'authenticate() ', sınıfların nesneleri değil, sınıflarda çağrılır. Daha net bir şey yapmalı mıyım? –

cevap

34

the importlib module, bu gibi modüllerin yüklenmesini işlemek için kullanmak istiyorsanız, sınıfları almak için getattr() kullanın.

import importlib 

cls = "somemodule.Test" 
module_name, class_name = cls.split(".") 

somemodule = importlib.import_module(module_name) 

print(getattr(somemodule, class_name)) 

beni verir: Örneğin:

, bir modül, sınıf Test içeren somemodule.py söylüyorlar

<class 'somemodule.Test'> 

Bu paketler gibi şeyler eklemek Önemsiz:

cls = "test.somemodule.Test" 
module_name, class_name = cls.rsplit(".", 1) 

somemodule = importlib.import_module(module_name) 

Daha önceden impolanmışsa modül/paket alınmayacaktır. rted, bu nedenle mutlu yükleme modüllerinin takip etmeden bunu yapabilirsiniz:

import importlib 

TWO_FACTOR_BACKENDS = (
    'id.backends.AllowToBeDisabled', # Disable this to enforce Two Factor Authentication 
    'id.backends.TOTPBackend', 
    'id.backends.HOTPBackend', 
    #'id.backends.YubikeyBackend', 
    #'id.backends.OneTimePadBackend', 
    #'id.backends.EmailBackend', 
) 

backends = [getattr(importlib.import_module(mod), cls) for (mod, cls) in (backend.rsplit(".", 1) for backend in TWO_FACTOR_BACKENDS)]