1

我最近偶然发现了这个 kickass python 扩展包,Brian Hears,它将解决我所有的编码问题。问题是,一些函数返回内存地址而不是预期的结果。例如:

>>> Parameterize(source, 256, 128)

Out[1]: <Parameterize.Parameterize at 0xda445f8>

我以前从未见过这个(也不知道它的正确名称);但是,互联网告诉我,它代表了存储结果的内存地址。

我真的只是对结果本身感兴趣。人们通常如何从python中的地址中提取实际数据,或者更确切地说是函数应该(或者至少我认为它应该)返回的numpy数组?

提前致谢。

编辑:添加了包的名称和链接

4

3 回答 3

2

它正在返回一个对象。你应该做

 p = Parameterize(source, 256, 128)
 res = p.usefull_attribute

然后从对象属性/属性中获取结果。您可以使用 python 的自文档(dir(p), help(p)(如其他答案+评论中指出的那样))让 python 告诉您您的对象具有哪些属性/方法。

它打印出来的是你的对象的默认字符串表示,这是它的类型和位置。

于 2012-10-23T01:37:26.483 回答
2

尽管有可能使用 ctypes 编写的非常薄的 Python 包装器对某些库确实返回了内存指针,但事实并非如此。就像你所拥有的<Parameterize.Parameterize at 0xda445f8>那样,表示是 Python 对象的标准字符串表示。

尽管它实际上意味着一个内存地址,但该数字在 Python 中没有用,但可以用作对象的 id。(您可以通过 " " 掌握它id(object))。

要了解如何使用您正在使用的模块,因为您处于交互式提示符下,请使用helpdirintrospection 内置函数来找出Parameterize对象上可用的属性和方法:

>>> p =Parameterize(source, 256, 128)
>>> p
Out[1]: <Parameterize.Parameterize at 0xda445f8>
>>> dir(p)
>>> help(p)
于 2012-10-23T02:05:36.700 回答
1

如果您使用的库是用 C(或 C++)编写的,并且如果函数返回“流行”(int、str 等)类型,您可能会对ctypes模块(boost.python、swing)感兴趣,以使用 python 类型包装 C 调用. 然后你可以使用这个库作为 python 的库。当然,您必须使用 ctypes 进行转换(您必须定义类型)。对于复杂的结构,您可能必须像 tcaswell 所说的那样自己完成。

于 2012-10-23T01:50:00.693 回答