在将Python2代码移植到Python3时处理ctypes和ASCII字符串

2024-10-03 06:18:24 发布

您现在位置:Python中文网/ 问答频道 /正文

昨晚我受够了,开始将PyVISA移植到Python 3(这里的进度是:https://github.com/thevorpalblade/pyvisa)。在

我已经做到了一切正常的地步,只要我以ASCII字符串而不是默认的unicode字符串(例如,
马力=视像仪(b“GPIB::16”)工程,鉴于 马力=视像仪(“GPIB::16”)没有,引发值错误。在

理想情况下,最终用户不必关心字符串编码。 关于我应该如何处理这个问题有什么建议吗?可能是ctypes类型定义中的什么?在

目前,相关的ctypes类型定义为:

ViString = _ctypes.c_char_p

Tags: 字符串httpsgithubcomasciiunicodectypesgpib
1条回答
网友
1楼 · 发布于 2024-10-03 06:18:24

ctypes与python3中的大多数内容一样,故意不在unicode和字节之间自动转换。这是因为在大多数用例中,这只会要求与人们改用python3来避免的mojibake或UnicodeEncodeError灾难相同的问题。在

然而,当你知道你只处理纯ASCII时,那就另当别论了。你必须是明确的,但你可以将这种明确性分解成包装。在


Specifying the required argument types (function prototypes)所述,除了标准的ctypes类型外,您可以传递任何具有from_param类方法的类,该类通常返回带有_as_parameter_属性的某个类型(通常是同一类型)的实例,但也可以只返回本机的ctypes-类型值。在

class Asciifier(object):
    @classmethod
    def from_param(cls, value):
        if isinstance(value, bytes):
            return value
        else:
            return value.encode('ascii')

这可能不是您想要的确切规则例如,它将在bytearray上失败(就像c_char_p一样),即使它可以安静地转换为bytes,但是这样您就不会想隐式地将int转换为bytes。任何东西,无论你决定什么规则都应该很容易编码。在


下面是一个示例(在OS X上,您显然必须更改libc在linux、Windows等中的加载方式,但您大概知道如何执行此操作):

^{pr2}$

显然,您可以捕捉异常并在这些异常对您的用例不够清楚的情况下引发另一个异常。在

类似地,您可以编写一个Utf8ifier,或者一个Encodifier(encoding, errors=None)类工厂,或者其他任何需要的特定库,并以相同的方式将其粘贴到argtypes中。在


如果您还想自动解码返回类型,请参见Return types^{}。在


最后一件事:当您确定数据假定为UTF-8时,但是您希望以python2.x不一样的方式处理它们(通过保留它们不变),甚至可以在3.x中这样做。完整的示例请参见here。在

相关问题 更多 >