微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在python中导入nim seq

如何解决在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

ma​​in.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 举报,一经查实,本站将立刻删除。