如何解决在python中导入nim seq
th.nim
import nimpy
import nimongo.bson
import nimongo.mongo
proc fib(): seq[Bson] {.exportpy.} =
var m: Mongo = newMongo()
let connected = m.connect()
let col = m["Feed"]["post"]
var docs: seq[Bson]
for document in col.find(%*{}).items():
docs.add(document)
return docs
main.py
import nimporter
import th
h = th.fib()
for item in h:
print(item)
在第 123 行的 nimporter
模块中,我添加了两个编译参数
'-d:nimOldCaSEObjects',#because of an error
'--bound_checks:off',#because of an error
输出:
<capsule object NULL at 0x7f1975a47ae0>
<capsule object NULL at 0x7f1975a77d50>
<capsule object NULL at 0x7f1975a77f60>
<capsule object NULL at 0x7f19759488a0>
<capsule object NULL at 0x7f1975948840>
...
如何在python中获得像dict或json这样的数据结构?
解决方法
PyCapsules
被定义为 here。您在 Python 代码的胶囊中接收 Bson
ref 对象,如果我理解正确,它们是 C 指针。您可以修改您的代码以返回字符串或任何其他不是 ref 对象 的类型,因此它可以工作:
import nimpy
import nimongo / [bson,mongo]
proc fib*: seq[string] {.exportpy.} =
let m = newMongo()
if m.connect():
let col = m["feed"]["post"]
for document in col.find(%*{}).items():
result.add($document)
在蟒蛇中:
import nimporter
import th
for item in th.fib():
print(item)
为了进一步说明,以下过程从 Nim 返回一个表到 Python:第一个是 Table
,第二个是 ref Table
。
import tables
import nimpy
proc objs*: Table[string,string] {.exportpy.} =
{"Nim": "Awesome"}.toTable
proc refs*: TableRef[string,string] {.exportpy.} =
{"Nim": "Awesome"}.newTable
import nimporter
import script as th
for k,v in th.objs().items():
print(k,"is",v)
for k,v in th.refs().items():
print(k,v)
只有第一个有效,第二个收到您可能没想到的 PyCapsule
:
Nim is Awesome
Traceback (most recent call last):
File "script.py",line 8,in <module>
for k,v in th.refs().items():
TypeError: 'PyCapsule' object is not iterable
,
你需要将你得到的 bson 对象转换成 Python 世界中可用的东西。由于 nimpy 可以愉快地将 json 转换为 Python dicts,因此在 Nim 中进行转换是有意义的。
不幸的是,nimongo 没有实现 bson-json 转换,正确的答案是编写该 proc,但这里有一个占位符答案,通过将 bson 解码为字符串,然后将其编码为 json。
>th.nim
import nimpy,nimongo/bson
from json import parseJson,JsonNode
#it's important here not to import the whole of json,as %* clashes
proc toJson*(bs:Bson):JsonNode =
parseJson($bs)
proc fib(): seq[JsonNode] {.exportpy.} =
var docs = @[%*{
"double": 5436.5436,"stringkey": "stringvalue","document": {
"double": 5436.5436,"key": "value"
},"array": [1,2,3],"int32": 5436'i32,"int64": 5436,}]
for doc in docs:
result.add(doc.toJson)
输出
{'double': 5436.5436,'stringkey': 'stringvalue','document': {'double': 5436.5436,'key': 'value'},'array': [1,'int32': 5436,'int64': 5436}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。