如何在 Python 中接受 iter 和非 iter return 类型

How to accept iter and non-iter return types in 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

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

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

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