[Pyasn1]:引发error.PyAsn1Error('组件类型错误%r vs%r'%(t,value))

时间:2016-09-06 11:31:15

标签: python pyasn1

我只有一个选择,在那个选择中我想只传递一个字段的对象。

这是我的代码段: -

from pyasn1.type import univ, namedtype, tag, char, namedval, useful
from pyasn1.codec.ber import encoder

class MiepPullWtdr(univ.Sequence):
    componentType = namedtype.NamedTypes(namedtype.NamedType('wtdrId', univ.Integer().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))))

class ChoiceData(univ.Choice):
    componentType = namedtype.NamedTypes(namedtype.NamedType('miepPullWtdr', MiepPullWtdr().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))))

seqObj = MiepPullWtdr()
seqObj.setComponentByName('wtdrId', 6555)
choiceObj = ChoiceData()
choiceObj.setComponentByName('miepPullWtdr', seqObj)

当我运行我的脚本test.py时,它会抛出此错误: -

Traceback (most recent call last):
  File "test.py", line 18, in <module>
  choiceObj.setComponentByName('miepPullWtdr', seqObj)
  File "/data/aman/cdr/lib/pyasn1-0.1.7/pyasn1/type/univ.py", line 760, in setComponentByName  verifyConstraints
  File "/data/aman/cdr/lib/pyasn1-0.1.7/pyasn1/type/univ.py", line 979, in setComponentByPosition
self._verifyComponent(idx, value)
File "/data/aman/cdr/lib/pyasn1-0.1.7/pyasn1/type/univ.py", line 751, in _verifyComponent
raise error.PyAsn1Error('Component type error %r vs %r' % (t, value))
pyasn1.error.PyAsn1Error: Component type error MiepPullWtdr() vs MiepPullWtdr().setComponentByPosition(0, Integer(6555))

有任何帮助吗?感谢。

1 个答案:

答案 0 :(得分:0)

MiepPullWtdr类型在其独立定义中标记为ASN.1的方式与ChoiceData组件的标记不一致。我不确定你的意图究竟是什么,这里有一个可能很多的一致版本:

from pyasn1.type import univ, namedtype, tag

class MiepPullWtdr(univ.Sequence):
    tagSet = univ.Sequence.tagSet.tagImplicitly(
        tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)
    )
    componentType = namedtype.NamedTypes(
        namedtype.NamedType('wtdrId', univ.Integer().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)))
    )

class ChoiceData(univ.Choice):
    componentType = namedtype.NamedTypes(
        namedtype.NamedType('miepPullWtdr', MiepPullWtdr())
    )

seqObj = MiepPullWtdr()
seqObj['wtdrId'] = 6555
choiceObj = ChoiceData()
choiceObj['miepPullWtdr'] = seqObj

print(choiceObj.prettyPrint())