我应该如何注释在 Python 中返回 ctypes 数组的函数?
Posted
技术标签:
【中文标题】我应该如何注释在 Python 中返回 ctypes 数组的函数?【英文标题】:How should I annotate a function returning a ctypes array in Python? 【发布时间】:2019-05-30 12:32:40 【问题描述】:考虑以下 Python 代码:
def foo(aqs : typing.List[int]) -> ??? :
array_type = ctypes.c_int64 * len(aqs)
ans = array_type(*aqs)
return ans
这个函数的返回值的正确注解是什么? (代替???
)
【问题讨论】:
您可能应该指定您的意思是ctypes
数组
什么是'*ids'?
@JörgBeyer,这是一个复制粘贴错误:代替ids
我的意思是aqs
和“List”,是“ctypes.List”吗?即不是一种带有小写字母“L”的“列表”?
@JörgBeyer,不,是typing.List
【参考方案1】:
这个函数没有一致的返回类型,因为返回数组的长度是数组类型的一部分。但是,类型始终是ctypes.Array
的子类,这是您可以使用的最具体的注解:
def foo(aqs: List[int]) -> ctypes.Array:
...
【讨论】:
我想它类似于变长元组:Tuple[int, ...]
【参考方案2】:
我是 Python 新手,但似乎 typing.List[T]
是您正在寻找的东西(就像 @JörgBeyer 在上面的评论中所说的那样)。
返回类RegistrationRequest
的实例列表的函数示例:
import string
import typing
from datetime import datetime
from dataclasses import dataclass
@dataclass()
class RegistrationRequest:
activity: string
start_at: datetime
def registrations_requests() -> typing.List[RegistrationRequest]:
return [
RegistrationRequest('Zumba', datetime(2019, 6, 25, 12, 30, 0, 0)),
RegistrationRequest('Zumba', datetime(2019, 6, 27, 19, 15, 0, 0)),
]
print('0'.format(registrations_requests()))
输出是:
[RegistrationRequest(activity='Zumba', start_at=datetime.datetime(2019, 6, 25, 12, 30)), RegistrationRequest(activity='Zumba', start_at=datetime.datetime(2019, 6, 27, 19, 15))]
【讨论】:
【参考方案3】:使用python内置的List类型List[T]
def foo(aqs : typing.List[int]) -> List[T]:
array_type = ctypes.c_int64 * len(aqs)
ans = array_type(*aqs)
return ans
将 T 替换为列表类型
【讨论】:
Ctypes 数组不是列表。以上是关于我应该如何注释在 Python 中返回 ctypes 数组的函数?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ctypes 将数组从 C++ 函数返回到 Python
Python/Windows/ctypes:调用 WaitForMultipleObjects 后如何获取进程返回状态?