[英]How to efficiently provide a Web, CLI & API interface in Python?
我的問題如下。 我的庫中有一些功能:
def some_func(arg1=1):
pass
我想以三種方式使用:
在其他python腳本中使用import語句:
import my_library
my_library.some_func()
單擊使用CLI界面進行公開。
@click.group()
@click.option('--arg1', default=1)
def some_func(arg1):
pass
使用帶有Flask的網絡界面進行曝光。
@app.route('/endpoint', defaults={'arg1': 1})
def some_func(arg1):
pass
但是,如何在不重復太多代碼的情況下有效地構造它呢?
是否可以合並所有三個? 我嘗試了以下操作(失敗):
@click.group()
@click.option('--arg1', default=1)
@app.route('/endpoint', defaults={'arg1': 1})
def some_func(arg1=1):
pass
還是我真的需要上面定義的3種不同功能?
如果是這樣,我應該如何獲取默認值?
是否在所有位置訪問全局變量是執行此操作的最佳方法?
由於裝飾器語法只是函數應用程序的快捷方式,因此首先要在庫中定義函數。 然后,您的click
示例變為:
import my_library
click.group()(click.option('--arg1', default=1)(my_library.some_func))
您的Flask示例變為
import library
app.route('/endpoint', defaults={'arg1': 1})(my_library.some_func)
(對於Flask,我知道裝飾器的返回值並不重要;我認為click
也是如此。)
假設您不打算同時使用命令行工具和Flask應用程序相同的腳本; IMO沒什么意義。
至於簡化默認值,沒有什么好想到的。 Click,Flask和您的函數有三種指示默認值的方法: 唯一的共同點是該默認值的實際值 。 您可能會做這樣的事情。 首先,在my_library.py
:
some_func_default = 1
def some_func(arg=None): # Or some other sentinel
if arg is None:
arg = some_func_default
然后在另外兩個腳本中:
click.group()(click.option('--arg1', default=my_library.some_func_default)(my_library.some_func))
和
app.route('/endpoint', defaults={'arg1': my_library.some_func_default})(my_library.some_func)
當然,您可以使用inspect
模塊從some_func
的原始定義中提取默認值,但這無助於Click和Flask為其入口點設置默認值的方式有所不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.