代码之家  ›  专栏  ›  技术社区  ›  gerrit

为什么创建此内存视图仅在分配给变量时才会引发ValueError?

  •  19
  • gerrit  · 技术社区  · 9 年前

    蟒蛇 memoryview not support datetime64 or timedelta 。好的。但当我尝试创建 memoryview 包含 日期时间64 时间增量 ,它似乎起作用。。。 除非我将其分配给变量 !

    In [19]: memoryview(zeros(10, dtype=[("A", "m8[s]")]))
    Out[19]: <memory at 0x7f1d455d6048>
    
    In [20]: x = memoryview(zeros(10, dtype=[("A", "m8[s]")]))
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    ValueError: cannot include dtype 'm' in a buffer
    
    In [21]: x = _19
    
    In [22]: x
    Out[22]: <memory at 0x7f1d455d6048>
    

    这严重挑战了我对Python基本工作方式的理解。怎么可能 f() x = f() 考虑到(1)IPythons REPL将输出分配给 _19 无论如何,以及(2)函数/类 内存视图 无法知道调用者将如何处理其输出?

    我在Python 3.4.1,numpy 1.10.0.dev+fbcc24f,Linux 2.6.32-431.23.3.el6.x86_64,Scientific Linux 6.6版上运行代码。


    编辑

    在Python 3.5,numpy 1.10.4上,我得到:

    In [50]: memoryview(numpy.zeros(10, dtype=[("A", "m8[s]")]))
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    ValueError: cannot include dtype 'm' in a buffer
    
    During handling of the above exception, another exception occurred:
    
    SystemError                               Traceback (most recent call last)
    <ipython-input-50-5d5ac6c085fa> in <module>()
    ----> 1 memoryview(numpy.zeros(10, dtype=[("A", "m8[s]")]))
    
    SystemError: <class 'memoryview'> returned a result with an error set
    

    我已经提交了 bug with numpy ,虽然我不太确定这就是问题所在。

    1 回复  |  直到 8 年前
        1
  •  3
  •   augurar    8 年前

    这里发生了一些非常奇怪的事情。

    >>> memoryview(zeros(10, dtype=[("A", "m8[s]")]))
    <memory at 0x102654348>
    >>> 
    ValueError: cannot include dtype 'm' in a buffer
    

    我猜想这与 https://bugs.python.org/issue23571 .一些C函数 memoryview 返回非空结果并设置错误标志。这显然会导致在 下一个 语句已执行!在Python 3.5中,解释器引发 SystemError 而是当这种情况发生时。

    看来这里真正的bug是 内存视图 函数,而不是numpy。