2011-02-24 3 views
1

내가 lxml.etree._Element에 속성을 주입하기 위해 노력하고있어,하지만 모듈이 완전히 C로 구현 한, setattr 실패 :파이썬 : C 라이브러리에 의해 생성 된 객체에 속성을 주입

Traceback (most recent call last): 
[...] 
    setattr(node.getroottree().getroot(), "attributeName", value) 
AttributeError: 'lxml.etree._Element' object has no attribute 'attributeName' 

사용의 경우 : 내가 가진 XPath에 의해 XML 파일에서 텍스트를 추출하고 $(ENV)와 같은 일치 항목을 해당 값으로 바꿉니다. 따라서 변수 사전 (예 :)을 해당 함수에 전달해야하는 대신 고정 된 위치 (코드의 XML 루트)에 특성을 추가하는 것이 더 쉬울 것입니다. 바보 같은 해결 방법을 사용할 수 있습니다 하지만 파이썬 속성을 주입하는 가장 좋은 방법이 될 것입니다. 각각의 XML 파일을 다른 변수 값을 가질 수 있기 때문에 내가 전역 변수를 사용할 수 없습니다. 그래서

, C 기반의 클래스/객체로 뭔가를 주입 할 수있는 방법?

답변

-1

일반적으로 C 정의 유형의 인스턴스는 인스턴스마다 임의의 속성을 보유하는 __dict__ 항목이 없기 때문에 사용할 수 없습니다.

하위 클래스 또는 래퍼 클래스가 작동하지 않으면 모듈 수준에서 추가 정보가있는 객체를 매핑하는 도우미 사전을 만드는 것입니다. 가지고있는 객체가 해시 가능하지 않은 경우 id(obj)을 대신 사용할 수 있습니다.) (

# Module level, setting up the data store 
from collections import defaultdict 
extra_info = defaultdict(dict) # Creates empty dicts for unknown keys 

# Saving the info 
root = node.getroottree().getroot() 
extra_info[id(root)]["ENV"] = "replacement" 

# Retrieving it later 
root = node.getroottree().getroot() 
info = extra_info[id(root)] 
+0

글쎄, 클래스를 포장하는 것은 다음'node.getroottree() getroot 때문에 작동하지 않습니다.

따라서, 예를 들어, 각 루트 오브젝트의 ID와 관련된 사전을 저장할 수 '여전히 랩핑되지 않은 객체를 가리킬 것입니다. 내 함수에는'node' 만 사용할 수 있습니다.) 현재 XML URL이 필요 없기 때문에'node.getrootree(). docinfo.URL = repr (variablesDict)'라는 해결 방법이 있습니다. 쓸 수있는 몇 가지 속성 중 하나),'eval'을 사용하여 사전을 다시 작성하십시오. – AndiDog

+0

내 대답에 더 나은 해결 방법을 추가했습니다. – ncoghlan

+0

답변 감사합니다. 해결 방법도 효과가 있지만 XML 문서와 함께 변수를 파기 할 것이므로 계속 유지할 것입니다. – AndiDog

관련 문제