デコレータと詳細情報を含むファブリックタスク終了の通知

既存のプロジェクトでは、リモートサーバーからのダンプの受信、データの集約など、長期にわたるファブタスクがあります。 タスクを開始し、N分(または1時間)後、次のウィンドウに気を取られ、覚えて、チェックしてください...非効率的です。
タスクの完了時にデスクトップ上にポップアップ通知を作成したかったため、ここで通知送信に関する記事が表示されました。 ファブ機能用のデコレータを作ることにしました-彼の場所です。

開始するには、簡単な通知関数を作成します
from django.conf import settings as django_settings from fabric.operations import local def _notify(message): if django_settings.FAB_NOTIFY_TASK_ENDS: local(u'notify-send --expire-time=10000 "Fabric notify" "{}"'.format(message)) 

はい、ジャングルがあり、「ヒントを表示」設定を使用して設定に移動します。

_notifyの使用も簡単です。
 from fab_utils import _notify def mongo_get_from_remote(server='', date='', collection=''): u"""   c  """ ... _notify(u" ") 

しかし、各関数では、最後に呼び出しを記述することは、どういうわけか「ドライ」ではありません(ドライドライブ)。 デコレータを書きましょう
 def notified(wrapped): def internal(*args, **kwargs): res = wrapped(*args, **kwargs) params = [unicode(a) for a in args] params.extend([u'{}={}'.format(k, v) for k, v in kwargs.iteritems()]) params = [_limit_str(p) for p in params] message = "{}({}) ended!!!".format(wrapped.__name__, ', '.join(params)) _notify(message) return res return internal 


そして、使用は
 from fab_utils import notified @notified def mongo_get_from_remote(server='', date='', collection=''): u"""   c  """ ... 


すべて問題ありませんが、コマンドのヘルプは表示されなくなりました:(
 wad@wad-vaio:~/aggregator (develop)$ bin/fab.sh -d mongo_get_from_remote Displaying detailed information for task 'mongo_get_from_remote': No docstring provided Arguments: 


どうする? ドックストリングを再定義する必要があります!
 def notified(wrapped): def internal(*args, **kwargs): ... return res internal.__doc__ = wrapped.__doc__ return internal 

 wad@wad-vaio:~/aggregator (develop!)$ bin/fab.sh -d mongo_get_from_remote Displaying detailed information for task 'mongo_get_from_remote':    c   Arguments: 

すでに優れていますが、議論はどこにありますか? 彼らは彼らの背後の布地の腸に入る必要がありました-彼はどのようにそれらを定義しますか?

ファイルenv / local / lib / python2.7 / site-packages / fabric / main.py:466が見つかりました
 def display_command(name): """ Print command function's docstring, then exit. Invoked with -d/--display. """ ... if hasattr(command, '__details__'): task_details = command.__details__() else: task_details = get_task_details(command) ... 

ええ、関数に__details__がある場合、引数を決定するために呼び出されます。 いいね!

最終的なデコレータコードは次のとおりです。
 from fabric.tasks import get_task_details def notified(wrapped): def internal(*args, **kwargs): res = wrapped(*args, **kwargs) params = [unicode(a) for a in args] params.extend([u'{}={}'.format(k, v) for k, v in kwargs.iteritems()]) params = [_limit_str(p) for p in params] message = "{}({}) ended!!!".format(wrapped.__name__, ', '.join(params)) _notify(message) return res def _details(): return get_task_details(wrapped) internal.__doc__ = wrapped.__doc__ internal.__details__ = _details return internal 


ファブの問題の説明
 wad@wad-vaio:~/aggregator (develop!)$ bin/fab.sh -d mongo_get_from_remote Displaying detailed information for task 'mongo_get_from_remote':    c   Arguments: server='', date='', collection='' 


私はPythonが大好きです:)

Source: https://habr.com/ru/post/J214259/


All Articles