2017-04-04 11 views
1

私はrun.pyとconstraints.pyxの2つのファイルを持っています。のL1Penaltyに似た拡張クラスを作成して、constraints.pyxにインスタンス化します。関数内で使用するrun.py私がやった何Pythonファイルへのcython拡張クラスのインポート(位置指定引数

:目で

from lightning.impl.sag_fast cimport Penalty 

cdef class ProbaPenalty(Penalty): 
    def __cinit__(self): 
     self.support_lagged = False 
... 

constraints.pyxは、拡張クラス、this codeでペナルティクラスのサブクラスが含まれています.py私はProbaPenaltyのインスタンスを作成します:

import pyximport; pyximport.install() 
from constraints import ProbaPenalty 
pen = ProbaPenalty() 

私が持っているエラーは、次のとおりです。

cinit() takes exactly 1 positional argument (0 given)

はケアレスミスはありますか?私はstackoverflowで同様の問題を見つけることができません。

AttributeError: 'custom_constraints.ProbaPenalty' object has no attribute 'b'

:私はビントに取るように私のCINITを変えてみました は、私が今

cdef class ProbaPenalty(Penalty): 
    def __cinit__(self, bint support_lagged): 
     self.support_lagged = support_lagged 

そして

pen = ProbaPenalty(0) 

この時間を利用していることを、このようなsupport_lagged、私はエラーを取得します私はbを呼び出しました、そしてbはどこから来ていますか?

私はProbaPenaltyにdouble bのベクトルを持たせたかったのですが、私はcinit(self、double * b)しましたが、コードを変更してから.cと.soファイルなどを削除しました。現在の.cファイルを調べると、属性bもありません。

同じ問題を抱えてsetup.pyでコンパイルしようとしました。

+0

答えの下にあるOPsコメントに基づいて、私は "もう再生できません"と投票しています。 – DavidW

答えて

0

__cinit__方法は、拡張型へのPythonレベルのアクセスに適していない、http://docs.cython.org/en/latest/src/reference/extension_types.html

は、Pythonから使用するためreguar __init__を定義参照。

+0

私は実際にスパイダーを閉じて再オープンした後、今朝もう一度実行しました。 いずれの場合でも、属性bが存在する理由は説明されませんでした。私はsetup.pyを再実行したときにクリアされなかった変数が何らかの形で保存されていたと思います。 –

関連する問題