2017-09-18 3 views
-1

私はWTForms custom validatorを作成して、重複するイメージハッシュを確認しようとしています。これを行うには、フォームバリデーターでネストされた関数を使用しています。問題は、外部関数に変数(内部関数の結果)を設定し、その後の外部変数への参照が内部関数を再度呼び出す場合です。例えばPython関数は静的変数を返すようにするには?

def dupe_check(self, field): 
    def get_hash(): 
     f = field.data 
     img = Image.open(f) 
     imghash = imagehash.dhash(img) 
     f.seek(0) 
     return imghash 
    imghash = get_hash() 
    hashcheck = Sights.query.filter(Sights.image_hash == imghash).first() 
    if hashcheck == imghash: 
     print('dupe') 
     raise ValidationError('duplicate hash!') 
    else: 
     print('no dupe') 

、データベース内の無ハッシュを実行した場合、私はno dupeを印刷した画像がアップロードされます。しかし

imghashは、単に以前imghash = get_hash()で設定されたハッシュ文字列を返す再度ないget_hash()を呼び出していることが表示されますので、実行がif hashcheck == imghash: Iクラッシュに達したときに、ハッシュは、データベース内に存在する場合。

単純にハッシュ文字列ではなく、imagehashプログラムが呼び出される(クラッシュする)ことが、以下で分かります。

127.0.0.1 - - [17/Sep/2017 17:49:36] "POST /add HTTP/1.1" 500 - 
Traceback (most recent call last): 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1997, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1985, in wsgi_app 
    response = self.handle_exception(e) 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1540, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise 
    raise value 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1982, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1614, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1517, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise 
    raise value 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1612, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1598, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/home/mrrg/dev/flaskimg/project/sights/views.py", line 74, in add_image 
    if form.validate_on_submit(): 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask_wtf/form.py", line 101, in validate_on_submit 
    return self.is_submitted() and self.validate() 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/wtforms/form.py", line 310, in validate 
    return super(Form, self).validate(extra) 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/wtforms/form.py", line 152, in validate 
    if not field.validate(self, extra): 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/wtforms/fields/core.py", line 204, in validate 
    stop_validation = self._run_validation_chain(form, chain) 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/wtforms/fields/core.py", line 224, in _run_validation_chain 
    validator(form, self) 
    File "/home/mrrg/dev/flaskimg/project/sights/forms.py", line 71, in dupe_check 
    if hashcheck == imghash: 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/imagehash/__init__.py", line 85, in __eq__ 
    return numpy.array_equal(self.hash.flatten(), other.hash.flatten()) 
AttributeError: 'Sights' object has no attribute 'hash' 

私はimghash = get_hash()は、内部関数から返される変数の新しいインスタンスを設定しますと思いましたか?どのようにして動作する静的変数を設定し、内部関数への追加呼び出しを避けることができますか?

また、内部関数のimghashでグローバル/非ローカルを同じ結果で設定しようとしました。

答えて

0

私はあなたのコードはImageHashオブジェクトにサイトオブジェクトを比較しようとしますが、視力クラスコードの実装が唯一の唯一の2サイトオブジェクト間で比較し、その誤差は、私は私があなたに従うかわからない

+0

表示されます。理解したよう私はSightクラス内で比較していません。 2つの変数を定義します。「imghash」は内部関数から作成され、「hashcheck」はSQLAlchemyクエリから作成されます。 – mrrg

+0

可変ハッシュチェックとインハッシュのタイプを表示できますか? –

+0

ああ、私は二つの異なる変数型があります: ''と ''。比較のために変数を正規化する最良の方法は何ですか? – mrrg

関連する問題