首页 > 解决方案 > 如何在 Python 中接受迭代和非迭代返回类型

问题描述

如果以前有人问过这个问题,请原谅我。我似乎无法过滤掉有关失败iter()覆盖的所有其他问题。

我正在使用https://github.com/mz-automation/libiec61850第三方库,它使用 SWIG 与其 C 代码交互。出于某种原因,如果出现错误,SWIG 会返回不同的内容。

>>> iec61850.IedConnection_getFileDirectory(mms._mms_con, "/SETTINGS")  
[<iec61850.sLinkedList; proxy of <Swig Object of type 'LinkedList' at 0x03063C20> >, 0]
>>> iec61850.IedConnection_getFileDirectory(mms._mms_con, "/FAKE")     
22  
>>> 

我该如何接受这两种情况?我唯一能想到的是 try/except TypeError,但在这种情况下我似乎无法得到错误条件。有没有办法修复 SWIG 翻译?

从iec61850_client.h:

LIB61850_API LinkedList /*<FileDirectoryEntry>*/
IedConnection_getFileDirectory(IedConnection self, IedClientError* error, const char* directoryName);

使用来自以下位置的 SWIG i 文件:

https://github.com/mz-automation/libiec61850/blob/v1.4/pyiec61850/iec61850.i

标签: pythonswig

解决方案


一位同事帮我解决了这个问题。我没有意识到您可以将列表设置为单个对象。呃。下面的代码很容易处理这两种情况。

try:
    [device_list, ied_error] = ret_object
except TypeError:
    # SWIG returns just an int on some failures.
    ied_error = ret_object

为了将来参考,这是使用单一返回类型的一个很好的理由......


推荐阅读