2013-06-18 24 views
1

현재 확장 모듈 클래스를 지원하는 일종의 작은 API를 작성하고 있습니다. 사용자는 구성에 클래스 이름을 쓸 수 있어야하며 프로그램에서 사용됩니다. 클래스 모듈은 기본 모듈 클래스의 인스턴스를 반환하기 위해 create(**kwargs)이라는 함수를 가지고 있으며 특수 폴더에 배치됩니다. 그러나 isinstance 검사는 가져 오기가 동적으로 수행되는 즉시 실패합니다.파이썬 2.7 동적으로 가져온 모듈 클래스에서 isinstance가 실패합니다.

모듈

(LIB/서비스/핑)에

class Service: 
    def __init__(self, **kwargs): 
     #some initialization 

예시 모듈 클래스 (LIB/서비스/서비스) LIB/서비스/이름

모듈 기본 클래스를 배치

class PingService(Service): 
    def __init__(self, **kwargs): 
     Service.__init__(self,**kwargs) 
     # uninteresting init 

def create(kwargs): 
    return PingService(**kwargs) 

가져 오기 기능

import sys 
from lib.services.service import Service 

def doimport(clazz, modPart, kw, class_check): 
    path = "lib/" + modPart 
    sys.path.append(path) 
    mod = __import__(clazz) 
    item = mod.create(kw) 

    if class_check(item): 
     print "im happy" 
     return item 

코드를 호출

class_check = lambda service: isinstance(service, Service) 
s = doimport("ping", "services", {},class_check) 

print s 

from lib.services.ping import create 

pingService = create({}) 
if isinstance(pingService, Service): 
    print "why this?" 

도대체 내가 뭐하는 거지 여기

그냥 추출하고 인수없이 test.py을 실행 zip example

+1

먼저 다음 sys.pathlib/services를 추가하면 그것이 내가 이상한 발견 상속, ... 또한

일을 만들 수 없습니다, 좀 더 강력한 보인다 imp.load_source을 사용하고 있습니다 .x를 사용하면 구식 클래스를 사용하지 않아야합니다. 'class Service :'가 아니라'class Service (object) :'를 항상 수행하십시오. 예전 스타일의 클래스에 대한 규칙은 새로운 스타일의 클래스와 크게 다르며 실제로 두 가지를 배우고 싶지 않습니다. – abarnert

+1

둘째, 코드가 전혀 실행되지 않습니다. 예를 들어,'mod.create (clazzItem)'은'clazzItem'에'NameError'를 발생시킵니다. 우리에게 실제적인 박살난, 실행 가능한 예를 들어주세요. – abarnert

+0

첫 번째 :이 질문은 내 질문과는 아무 상관이 없습니다. 두 번째 : 예전 스타일 수업에 대한 규칙이 마음에 듭니다. –

답변

2

문제는 ping.py에 있었다, 최대 압축 작은 예입니다 잘못 파일. 나는 이유를 정확하게 모르지만, dinamically 그것을 가져올 때 from service import Service 라인을 받아들이지 않았으므로, 그냥 상대 경로 : from lib.services.service import Service로 변경해야합니다. 파이썬이 사용하는 경우,

import os, imp 
def doimport(clazz, modPart, kw, class_check): 
    path = os.path.join('lib', modPart, clazz + '.py') 
    mod = imp.load_source(clazz, path) 
    item = mod.create(kw) 

    if class_check(item): 
     print "im happy" 
     return item 
+1

으로 업데이트했습니다. imp.load_source는 정확히 2 개의 인수, 즉 1을받습니다. –

+0

고맙습니다 ... 답변을 업데이트했습니다 ... –

+0

구문 오류가 발생했습니다. 주 오류가 있습니다. Plz 내 샘플을 봐야 –