2016-11-12 6 views
0

SQL AlchemyプロジェクトでUnique Object 'mixin'を使用しようとしています。しかし、私のアプリケーションが次のPythonエラーでクラッシュしているので、私は間違って何かをしています。クラッシュ:メソッドは3つの引数を取るようですが、2つだけが渡されました

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 588, in _runCallbacks 
    current.result = callback(current.result, *args, **kw) 
    File "/home/user/proj/dir/a/pipelines.py", line 26, in process_item 
    deck = self.extract_deck(item['md'], item['sb'], current_session) 
    File "/home/user/proj/dir/a/pipelines.py", line 62, in extract_deck 
    card = Card.as_unique(session, name=name) 
    File "/home/user/proj/dir/unique_mixin.py", line 39, in as_unique 
    arg, kw) 
    File "/home/user/proj/dir/unique_mixin.py", line 9, in _unique 
    key = (cls, hashfunc(*arg, **kw)) 
TypeError: unique_hash() takes exactly 3 arguments (2 given) 

私はunique_hash方法に予想より少ないパラメータを渡しているように思える...しかし、問題がある場所を正確に私は知りません。

ここでは、一意性に使用しているコードを示します。これは、与えられたSQLAlchemyモデルの辞書キャッシュを定義します。

def _unique(session, cls, hashfunc, queryfunc, constructor, arg, kw): 
    cache = getattr(session, '_unique_cache', None) 
    if cache is None: 
     session._unique_cache = cache = {} 

    key = (cls, hashfunc(*arg, **kw)) 
    if key in cache: 
     return cache[key] 
    else: 
     with session.no_autoflush: 
      q = session.query(cls) 
      q = queryfunc(q, *arg, **kw) 
      obj = q.first() 
     if not obj: 
      obj = constructor(*arg, **kw) 
      session.add(obj) 
     cache[key] = obj 
     return obj 

class UniqueMixin(object): 
    @classmethod 
    def unique_hash(cls, *arg, **kw): 
     raise NotImplementedError() 

    @classmethod 
    def unique_filter(cls, query, *arg, **kw): 
     raise NotImplementedError() 

    @classmethod 
    def as_unique(cls, session, *arg, **kw): 
     return _unique(session, 
         cls, 
         cls.unique_hash, 
         cls.unique_filter, 
         cls, 
         arg, kw) 

は、ここに私のカードモデルが機能を継承方法です。

class Card(UniqueMixin, Base): 
    __tablename__ = 'cards' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50), unique=True) 
    cards_deck = relationship("DeckCardCount", back_populates='card', cascade='all, delete-orphan') 

    # For uniqueness 
    @classmethod 
    def unique_hash(cls, query, name): 
     return name 

    @classmethod 
    def unique_filter(cls, query, name): 
     return query.filter(Clard.name == name) 

ここでは、ユニークなカードを照会しようとしています。

name = 'Some Unique Name' 
card = Card.as_unique(session, name=name) 

答えて

1

queryにはunique_hashを渡していません。 sessionは、関数defで別途指定されているため、argの一部ではありません。したがって、1つのパラメータnamekwを経由してunique_hashに渡されます。 queryunique_hash機能で使用されていないことを考慮すると

、あなたは*argを使用して、単純にそれを削除するか、それがはっきりしないことによって、この問題を解決することができます

@classmethod 
def unique_hash(cls, *arg, name=None): 
    return name 
関連する問題