【问题标题】:How should I annotate a function returning a ctypes array in Python?我应该如何注释在 Python 中返回 ctypes 数组的函数?
【发布时间】: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

标签: python arrays function annotations definition


【解决方案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 数组不是列表。
    猜你喜欢
    • 1970-01-01
    • 2016-11-11
    • 2022-11-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多