2014-12-04 71 views
2

這是一個奇怪的問題,有時會發生在我使用SWIG生成Python包裝時。它同時適用於Swig 2.x和3.x版本。我不知道是什麼觸發它,但有時在代碼重構後出現此錯誤。SWIG生成無效的Python包裝代碼

問題是SWIG生成的代碼不是有效的Python,而是某種僞代碼。例如

class SwigPyIterator(_object): 

    ... note that method definitions are not Python: 

    def value(self) -> "PyObject *" : return _vabamorf.SwigPyIterator_value(self) 
    def incr(self, n : 'size_t'=1) -> "swig::SwigPyIterator *" : return _vabamorf.SwigPyIterator_incr(self, n) 
    def decr(self, n : 'size_t'=1) -> "swig::SwigPyIterator *" : return _vabamorf.SwigPyIterator_decr(self, n) 

我使用setuptools和這裏的線相關痛飲:

swigging estnltk/pyvabamorf/vabamorf.i to estnltk/pyvabamorf/vabamorf_wrap.cpp 
swig -python -c++ -py3 -o estnltk/pyvabamorf/vabamorf_wrap.cpp estnltk/pyvabamorf/vabamorf.i 

有誰知道,什麼觸發這個行爲,以及如何解決它?過去我已經能夠解決這個問題,但是我從未能夠追蹤導致這個問題消失的具體變化。

+0

嗯,它可以正確使用Python2,但不是Python3。 – Timo 2014-12-04 23:28:32

回答

1

大師讓新手走向門口,用一隻支持他的肩膀的手說:「去年輕的新手,並閱讀他媽的手冊。」所以新手變得開明瞭。

好吧,這是一個愚蠢的用戶錯誤。 這實際上是預期的行爲,這個僞代碼實際上被稱爲function annotations

它也記錄在SWIG documentation

The -py3 option will enable function annotation support. When used SWIG is able to generate proxy method definitions like this: 

    def foo(self, bar : "int" = 0) -> "void" : ... 

看來我設法迷惑自己不要清洗所有的文件之間Python2/Python3編譯並得到了由重構過程中引入一些進口相關的錯誤也分心。

當,我沒有設法讓自己在一段時間內感到驚訝。