- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一个代码生成器,它可以生成围绕 ctypes.cdll
的函数加载的函数。生成器将获取有关 ctypes
的信息。的参数和返回值,并生成一些行为(并且在某种程度上看起来)像这样的东西:
func = getattr(dll, 'UglyLongAndUselessCName')
func.argtypes = [ctypes.c_uint32, ctypes.c_int8, ctypes.c_char_p]
func.restype = ctypes.c_int16
def nice_python_name(handle: int, arg1: int, arg2: str) -> int:
return func(handle, arg1, arg2)
注意 python 类型注释如何与 ctypes
很好地配合使用函数参数的数据类型。另请注意,nice_python_name
中的 python 类型之间没有转换代码。功能和func
功能。这就是我的问题。
ctypes
文档说如果 argtypes
使用“基本数据类型”指定加载的 DLL 函数的属性,然后在调用加载的 DLL 函数时,ctypes
将为您转换为 python 类型。这很好,因为在这种情况下,我生成的代码将类似于上面的示例 - 我不需要显式转换 ctypes
返回值的对象转换为 python 类型的值,而参数则相反。
但是,文档还说对于“基本数据类型的子类”,这个技巧不起作用,调用加载的 DLL 函数将需要 ctypes
对象作为参数,结果将是 ctypes
对象。
这是来自 the ctypes
docs 的摘录关于它:
Fundamental data types, when returned as foreign function call results, or, for example, by retrieving structure field members or array items, are transparently converted to native Python types. In other words, if a foreign function has a
restype
ofc_char_p
, you will always receive a Python bytes object, not ac_char_p
instance.Subclasses of fundamental data types do not inherit this behavior. So, if a foreign functions
restype
is a subclass ofc_void_p
, you will receive an instance of this subclass from the function call. Of course, you can get the value of the pointer by accessing the value attribute.
所以,我想解决这个问题。
看来我需要知道一个类型是“基础”还是“子类”。这将帮助我定义代码生成的方式,即对于“基本”类型,生成的代码看起来类似于上面的示例,对于“基本”类型的子类,它将从 ctypes
进行额外转换。将对象转换为合理的 Python 类型(否则生成器只会抛出一个异常,提示“这不受支持”)。
ctypes
数据类型”和“基本 ctypes
数据类型的子类”?我查看了 ctypes
的代码python 模块并发现 c_void_p
和 c_char_p
是 ctypes._SimpleCData
的子类,因此一个在任何方面都不是另一个的子类。
另外,我是否误解了这个问题也适用于输入参数,或者这只是针对返回值的处理?
最佳答案
... do I misunderstand it that this problem also applies to the input arguments, or is this only the deal for the returned values?
它不适用于输入参数,如下面的序列所示:
>>> dll=CDLL('msvcrt')
>>> dll.printf.argtypes = c_char_p,
>>> dll.printf(b'abc') # Note: 3 is the return value of printf
abc3
>>> class LPCSTR(c_char_p): # define a subtype
... pass
...
>>> dll.printf.argtypes = LPCSTR,
>>> dll.printf(b'abc')
abc3
转换仍然适用于输入子类型;但是,输出子类型的工作方式与您提到的文档引用不同:
>>> dll.ctime.argtypes = c_void_p,
>>> dll.ctime.restype = c_char_p
>>> dll.ctime(byref(c_int(5)))
b'Wed Dec 31 16:00:05 1969\n'
>>> dll.ctime.restype = LPCSTR
>>> dll.ctime(byref(c_int(5))) # not converted to Python byte string
LPCSTR(1989707373328)
>>> x = dll.ctime(byref(c_int(5))) # but can get the value
>>> x.value
b'Wed Dec 31 16:00:05 1969\n'
关于python - 区分 "fundamental"ctypes数据类型及其子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55050845/
不确定是否可能,但只是想知道 CSS 中是否有一种方法来区分两种浏览器,即 IE6 和 IE8,因为我有一个我需要应用的样式,但 IE6 和 IE8 的值需要不同,即 ul.sf-menu li li
我正在为 C 库编写 C++ 抽象。 C 库有几个用于标识远程资源的 ID 的类型定义: typedef int color_id; typedef int smell_id; typedef int
有谁知道当以编程方式遍历 Word 文档时,您可以判断一个段落是否构成目录的一部分(或者实际上,构成字段一部分的任何其他内容)。 我提出这个问题的原因是我有一个 VB 程序,它应该从文档中提取前几段实
假设我的数据集包含三列:id(标识)、case(字符)和 value(数字)。这是我的数据集: tdata <- data.frame(id=c(1,1,1,1,2,2,2,2,3,3,3,3,4,4
我在解释 gcc (4.8.2) 警告和错误时遇到问题。更准确地说,很难分辨一个问题在哪里结束,另一个问题从哪里开始。我只能通过控制台访问构建机器,因此不能选择使用 IDE。 我真的需要能够快速区分个
我想创建一个泛型类型,它只从类定义中选择修饰的方法。 function test(ctor: any, methodName: any) {} class A { @test publ
是否有规范的 base-R 方法来确定函数参数是否是对象名称而不是文字/表达式? 虽然通常不鼓励使用 NSE,但偶尔会有人有一个好主意并想使用它。 data.frame 是我认为“方便”的最简单用例:
我已经实现了 didSelectRowAtIndexPath 和accessoryButtonTappedForRowWithIndexPath 似乎永远不会触发。但是,didSelectRowAtI
我需要确定数据框中的哪些列是小数,哪些是字符串。 使用 df.dtypes 为两种列类型提供“对象”: import pandas as pd import decimal data = {'dec1
有没有办法在 Vim 中区分隐藏缓冲区和事件缓冲区? 我需要确定窗口中的缓冲区是否处于事件状态,以便可以切换它。 尝试了 bufloaded、bufexists 和 buflisted,但它们对于事件
在 JavaScript 中区分事件的最佳方法是什么。 实际上有两点我感兴趣。第一点是事件中是否有类似 id 的东西(这对于调试目的非常有用)。另一点是有更好的方法来区分 mousedown 和 mo
我有一个 php 页面,里面有多个表单。 "> "> " value=""> " value=""> 这些表单是通过循环遍历 MySQL 上的所有数据而生成的。每个表单和输入都
Pony 有一个未参数化的异常值。 不幸的是,我经常有一些代码想要抛出不同类型的异常,并且我需要知道它们是什么,以便正确处理它们——例如,简单地说,当停止程序时,向用户提供以下信息很重要正确的错误消息
出于对所有神圣事物的热爱,您如何区分预定义的 .NET 异常类中的不同“异常风格”? 例如,一段代码可能会抛出 XmlException在以下条件下: 文档的根元素为NULL 文档中的字符无效 文档太
正如您在下面看到的,我创建了一个 JComboBox,其中“选项”数组中的元素作为列表中的选项。 当选择列表中的特定项目时,我想显示 JLabels“一个”或“两个”。例如。选择选项一显示“一”,选择
我有一个表,其中包含四列用户名、产品名称、产品价格和一个名为 item_paid 的 boolean 列。相同的产品名称可以作为重复条目插入到表中。但是有没有办法区分一行和重复行?或者我应该创建一个名
是否可以使用反射来区分仅 getter 属性和表达式主体属性? class MyClass { DateTime GetterOnly { get; } DateTime Expres
我即将为一个学校项目制作一个小程序,该程序应该能够识别通过 MIDI 钢琴输入演奏的和弦(这只是其中的一部分)。 目前为止,每次按下和每次释放 MIDI 键盘上的某个键,我都会得到一个 ShortMe
我正在使用“自动”反序列化器从 Kafka 消费 Avro 序列化消息,例如: props.put( ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFI
我需要从两个表中检索数据。第一个是事件列表,第二个是 field 列表。 我在两个表中都有一个同名的字段:events.venue(这是一个 ID),venues.venue 是地点的名称,比如“bl
我是一名优秀的程序员,十分优秀!