Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python3cython:函数_注释_产生unicode而不是str_Python_Python 3.x_Annotations_Cython - Fatal编程技术网

python3cython:函数_注释_产生unicode而不是str

python3cython:函数_注释_产生unicode而不是str,python,python-3.x,annotations,cython,Python,Python 3.x,Annotations,Cython,在我的代码库中,我使用Cython从模块创建共享对象文件。当我尝试访问函数\uuuuuu注释\uuuuu时,当我使用Cython和不使用Cython时,我会得到不同的行为,我想知道为什么会出现这种情况: 最简单的例子: 我试图生成一个最小的可复制示例,并在同一目录中创建了以下两个文件main.py和setup.py。要求:pip安装Cython设置工具 main.py 导入设置 def测试(名称:str):通过 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu'

在我的代码库中,我使用
Cython
从模块创建共享对象文件。当我尝试访问函数
\uuuuuu注释\uuuuu
时,当我使用Cython和不使用Cython时,我会得到不同的行为,我想知道为什么会出现这种情况:

最简单的例子: 我试图生成一个最小的可复制示例,并在同一目录中创建了以下两个文件
main.py
setup.py
。要求:
pip安装Cython设置工具

main.py

导入设置
def测试(名称:str):通过
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
打印(测试注释、设置测试注释)
Setup.py

来自Cython.Build导入cythonize
从设置工具导入设置,扩展
def测试(名称:str):通过
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
安装程序(python_需要='>=3.6',ext_modules=cythonize([Extension('setup',['setup.py']),],language_level=“3”))
执行

python main.py
>{'name':}
>{'name':}
python setup.py build_ext--inplace
python main.py
>{'name':}
>{'name':'unicode'}
在使用共享对象文件时,我希望
\uuu注释\uuu
也会产生
str
,但它会产生
unicode
。为什么会这样


我使用的是
python3.9.2
Cython版本0.29.21
这实际上是一个bug报告,而不是一个问题,因此可能应该放在Cython bug跟踪器上而不是这里。幸运的是

这里发生了一些事情:

  • Cython仍然致力于支持Python 2.7。这意味着它生成的代码必须同时在这两个方面工作。虽然注释是Py3的一个特性,但获取名称的代码是通用的,并在许多地方使用。因此,它选择
    unicode
    而不是
    str
    作为它知道绝对是unicode的字符串,以确保两者都受支持
  • 您选择的
    language\u level=3
    也会影响它-字符串是unicode的,无论它是否在Python 2或3中运行。如果您使用它,它将使用“本机”字符串,并因此返回
    str
    (即Py2上的
    bytes
    ,Py3上的
    unicode
  • 至少在Cython 3(目前是alpha)上,Cython实现了注释,因此注释总是以字符串而不是类型的形式存储-因此您得到的是
    'unicode'
    ,而不是
    。这反映了Python的未来行为。我不认为这是Cython0.29.x中的更改,所以我有点惊讶于您在这里看到它-在这种情况下,这可能是一个意外地“正确”的快捷方式
  • 即将发布的Cython3版本旨在改进注释(和其他内省特性)的处理,使其更接近Python行为。0.29分支可能看不到对此的更改