第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

“無法將 Python 對象參數(shù)轉(zhuǎn)換為類型 '<typename>'”

“無法將 Python 對象參數(shù)轉(zhuǎn)換為類型 '<typename>'”

PHP
富國滬深 2021-06-10 17:17:31
我正在嘗試運行一個 cython 示例,該示例比許多教程(例如本指南)中的示例要復(fù)雜一些。這是一個最小的示例(請不要介意它沒有太多功能)和重現(xiàn)我的問題的步驟:有 c++ 類Rectangle和Group2(我把所有東西都放在 .h 文件中以使其更短):// Rectangle.hnamespace shapes {     class Rectangle {        public:            Rectangle() {}    };    class Group2 {    public:        Group2(Rectangle rect0, Rectangle rect1) {}    };}然后創(chuàng)建一個grp2.pyx文件(在相同的文件夾在上述報頭),與包裝器Rectangle和Group2:# RECTANGLEcdef extern from "Rectangle.h" namespace "shapes":    cdef cppclass Rectangle:        Rectangle() except +cdef class PyRectangle:    cdef Rectangle c_rect    def __cinit__(self):        self.c_rect = Rectangle()# GROUP2cdef extern from "Rectangle.h" namespace "shapes":    cdef cppclass Group2:        Group2(Rectangle rect0, Rectangle rect1) except +    cdef class PyGroup2:    cdef Group2 c_group2    def __cinit__(self, Rectangle rect0, Rectangle rect1):        self.c_group2 = Group2(rect0, rect1)該擴展是通過setup.py我從命令行 ( python setup.py build_ext -i)調(diào)用的文件構(gòu)建的:from distutils.core import setup, Extensionfrom Cython.Build import cythonizesetup(ext_modules = cythonize(Extension(           name="grp2",                                # the extension name           sources=["grp2.pyx"], # the Cython source            language="c++",                        # generate and compile C++ code      )))在這一點上我在錯誤_cinint_的PyGroup2:無法將 Python 對象參數(shù)轉(zhuǎn)換為“矩形”類型我想我的 pyx 文件中有一些錯誤,但我不知道是什么。
查看完整描述

1 回答

?
夢里花落0921

TA貢獻1772條經(jīng)驗 獲得超6個贊

您應(yīng)該PyRectangle在def-functions的簽名中以及PyRectangle.c_rect在將矩形傳遞給 C++-functions 時使用。


這意味著您的代碼應(yīng)該是:


cdef class PyGroup2:

    ...

    def __cinit__(self, PyRectangle rect0, PyRectangle rect1):

        self.c_group2 = Group2(rect0.c_rect, rect1.c_rect)

請繼續(xù)閱讀以獲取更詳細的解釋。


傳遞給def-functions 的所有參數(shù)都是 Python 對象(即objectCython 說法中的類型),畢竟這些函數(shù)將從純 Python 中調(diào)用,而純 Python 只知道 Python 對象。


但是,您可以添加一些語法糖并在def- 函數(shù)的簽名中使用“后期綁定” ,例如,而不是


def do_something(n):

  ...


def do_something(int n):

  ...

在幕后,Cython 會將此代碼轉(zhuǎn)換為類似以下內(nèi)容:


def do_something(n_):

   cdef int n = n_ # conversion to C-int

   ...

這種自動轉(zhuǎn)換對于像int或這樣的內(nèi)置類型是可能的double,因為 Python-C-API 中有這些轉(zhuǎn)換的功能(即PyLong_AsLong, PyFloat_AsDouble)。Cython 還處理錯誤檢查,因此您不應(yīng)手動進行這些轉(zhuǎn)換。


但是,對于像您的Rectangle-class 這樣的用戶定義類型/類,這種自動轉(zhuǎn)換是不可能的 - Cython 只能自動轉(zhuǎn)換為cdef-classes/extensions,即PyRectangle,因此PyRectangle應(yīng)該在簽名中使用:


cdef class PyGroup2:

    ...

    def __cinit__(self, PyRectangle rect0, PyRectangle rect1):

        ...

在 Cython 完成從objectto的轉(zhuǎn)換之后,必須使用- 指針手動執(zhí)行從toPyRectangle的最后一步:PyRectangleRectanglec_rect


...

def __cinit__(self, PyRectangle rect0, PyRectangle rect1):

    self.c_group2 = Group2(rect0.c_rect, rect1.c_rect)

cpdef-function的規(guī)則類似,因為它們可以從純 Python 中調(diào)用。在“早期綁定”僅適用于該用Cython可以自動從/ coverted到Python對象類型。


不出所料,唯一可以在其簽名中包含 C++ 類的cdef函數(shù)是-functions。


查看完整回答
反對 回復(fù) 2021-06-15
  • 1 回答
  • 0 關(guān)注
  • 183 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號