gpt4 book ai didi

python - 带范围的 pyobjc 索引访问器方法

转载 作者:行者123 更新时间:2023-11-28 17:55:03 27 4
gpt4 key购买 nike

我正在尝试根据 the KVC guide 在 Python 中为我的模型类实现索引访问器方法。 .出于性能原因,我想使用可选的范围方法一次加载多个对象。该方法采用指向 C 数组缓冲区的指针,我的方法需要将对象复制到该缓冲区中。我试过类似下面的方法,但没有用。我该如何实现?

@objc.accessor    # i've also tried @objc.signature('v@:o^@')
def getFoos_range_(self, range):
return self._some_array[range.location:range.location + range.length]

编辑:我终于找到了type encodings reference在 Apple 移动所有文档之后。读完之后,我尝试了这个:

@objc.signature('v@:N^@@')
def getFoos_range_(self, buf, range):

但这似乎也没有用。第一个参数应该是指向 C 数组的指针,但长度在运行时是未知的,所以我不知道如何构造正确的类型编码。我尝试了 'v@:N^[1000@]@' 只是为了看看,但也没有用。

我的模型对象绑定(bind)到驱动 TableView 的 NSArrayController 的 contentArray。它似乎根本没有调用此方法,可能是因为它需要与桥接器提供的签名不同的签名。有什么建议吗?

最佳答案

你很接近。此方法的正确装饰器是:

@objc.signature('v@:o^@{_NSRange=QQ}')

NSRange不是对象,而是结构,不能简单地指定为 @ ;您需要包括成员1

不幸的是,这还没有结束。经过大量实验并仔细研究 PyObjC 源代码后,我终于弄明白,为了使此方法起作用,您需要为该签名冗余的方法指定元数据。 (然而,我仍然没有弄明白为什么。)

这是使用函数 objc.registerMetaDataForSelector 完成的:

objc.registerMetaDataForSelector(b"SUPERCLASSNAME", 
b"getKey:range:",
dict(retval=dict(type=objc._C_VOID),
arguments={
2+0: dict(type_modifier=objc._C_OUT,
c_array_length_in_arg=2+1),
2+1: dict(type=b'{_NSRange=II}',
type64=b'{_NSRange=QQ}')
}
)
)

可以在文件 test_metadata_py.py 中找到使用此函数的示例和一些详细信息(和附近的 test_metadata*.py 文件)在 PyObjC 源代码中。

注意元数据必须在您有兴趣实现的任何类的父类(super class) 上指定get<Key>:range:因为,并且还需要在类定义结束之前的某个时间调用此函数(但在 class 语句本身之前或内部似乎都有效)。我也没有弄清楚这些问题。

我将此元数据基于 NSArray getObjects:range: 的元数据在 Foundation PyObjC.bridgesupport 文件2 中,并通过引用 Apple 的 BridgeSupport manpage 获得帮助.

解决这个问题后,还值得注意的是,定义该方法的最简单方法是(至少,IMO):

@objc.signature('v@:o^@{_NSRange=QQ}')
def get<#Key#>_range_(self, buf, inRange):
#NSLog(u"get<#Key#>")
return self.<#Key#>.getObjects_range_(buf, inRange)

即,使用数组的内置 getObjects:range: .


1:在 32 位 Python 上,QQ , 表示两个 unsigned long long s,应该变成II , 表示两个 unsigned int
2:位于(在雪豹上):/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/Foundation/PyObjC.bridgesupport

关于python - 带范围的 pyobjc 索引访问器方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1376463/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com