C++ Cython 映射操作返回 {b'a': 2} 而不是 {'a': 2}

C++ Cython Map operations returns {b'a': 2} rather than {'a': 2}

提问人:user58925 提问时间:10/10/2023 最后编辑:user58925 更新时间:10/10/2023 访问量:62

问:

为什么以下代码打印 {b'a': 2} 而不是 {'a': 2}。 我该如何解决它:

文件1:parameters.pyx

# parameters.pyx
from libcpp.map cimport map
from libcpp.string  cimport string

cdef class Parameters:
    cdef map[string,int] data
    cdef int myVal

    def __init__(self):
        self.data['a'] = 1
        self.myVal = 0

    cpdef void change_data(self, map[string,int] newdata):
        self.data = newdata

    cpdef map[string,int] print_data(self):
        print(self.data)

    cpdef void change_myVal(self):
        self.myVal = 3

文件2

# model.pyx

#from parameters import Parameters
from parameters import Parameters
from libcpp.map cimport map
from libcpp.string  cimport string

cpdef single_run():
    parameters = Parameters()

    cdef map[string,int] newMap
    
    newMap['a'] = 2

    parameters.change_data(newMap)

    
    parameters.print_data()

    parameters.change_myVal()

Setup.py 文件

#!/usr/bin/env python3

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize(["*.py","*.pyx"],
language="c++")
    
)
Python C++ Cython 标准

评论

0赞 Christoph 10/10/2023
代码打印 b'a': 2,因为 libcpp.string 映射中的键是 C++ 字符串,当转换为 Python 时,它们是类似字节的对象。
0赞 user58925 10/10/2023
我该如何解决这个问题?我怎样才能让它正确附加,即 'a':2
0赞 Christoph 10/10/2023
有很多方法,试着自己找到它,现在是你学习gg的时候了
0赞 user58925 10/10/2023
你能指出其中的几种方法吗?
0赞 hpaulj 10/10/2023
b'a'是一个字节字符串,以前是 Python 中的默认字符串类型。现在默认值为 unicode,仅显示为 .两者都可以在 python 中使用。一个只有标记。'a'b

答:

1赞 Goku - stands with Palestine 10/10/2023 #1

您可以直接使用:

d = {b'a': 2}

因为 是一个字节对象。b'a'

如果要将其转换为字符串,可以在 byte 对象上使用:decode("utf-8")

d = {k.decode("utf-8"):v for k,v in d.items()}

print(d)

#output
{'a': 2}