簡體   English   中英

如何在Python中有效提供Web,CLI和API接口?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM