Bagaimana cara membuat perintah CLI Flask kustom dengan 2 argumen atau lebih?
Saya ingin membuat perintah CLI Flask kustom. Ini berfungsi dengan baik ketika saya hanya menggunakan dengan 1 argumen tetapi tidak berfungsi untuk 2 argumen atau lebih. Saya menggunakan kode di bawah ini dan gagal untuk 2 atau lebih argumen:
# Usage: flask power 2 3
# Output: 6
@app.cli.command()
@click.argument('x','y')
def power(x, y):
print(int(x)**int(y))
Kode berikut berfungsi dengan baik hanya dengan 1 parameter
# Usage: flask power 2
# Output: 6
@app.cli.command()
@click.argument('x')
def power(x):
print(int(x)**3)
Kesalahan yang direproduksi dengan 2 atau lebih kode argumen adalah:
flask power 2 3
Traceback (most recent call last):
File "/home/user/.local/bin/flask", line 8, in <module>
sys.exit(main())
File "/home/user/.local/lib/python3.5/site-packages/flask/cli.py", line 894, in main
cli.main(args=args, prog_name=name)
File "/home/user/.local/lib/python3.5/site-packages/flask/cli.py", line 557, in main
return super(FlaskGroup, self).main(*args, **kwargs)
File "/home/user/.local/lib/python3.5/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/home/user/.local/lib/python3.5/site-packages/click/core.py", line 1254, in invoke
cmd_name, cmd, args = self.resolve_command(ctx, args)
File "/home/user/.local/lib/python3.5/site-packages/click/core.py", line 1297, in resolve_command
cmd = self.get_command(ctx, cmd_name)
File "/home/user/.local/lib/python3.5/site-packages/flask/cli.py", line 515, in get_command
rv = info.load_app().cli.get_command(ctx, name)
File "/home/user/.local/lib/python3.5/site-packages/flask/cli.py", line 372, in load_app
app = locate_app(self, import_name, name)
File "/home/user/.local/lib/python3.5/site-packages/flask/cli.py", line 235, in locate_app
__import__(module_name)
File "/projects/challenge/myflaskproj/__init__.py", line 6, in <module>
from myflaskproj.commands import power, repeat
File "/projects/challenge/myflaskproj/commands.py", line 6, in <module>
@click.argument('x','y')
File "/home/user/.local/lib/python3.5/site-packages/click/decorators.py", line 168, in decorator
_param_memo(f, ArgumentClass(param_decls, **attrs))
File "/home/user/.local/lib/python3.5/site-packages/click/core.py", line 1984, in __init__
Parameter.__init__(self, param_decls, required=required, **attrs)
File "/home/user/.local/lib/python3.5/site-packages/click/core.py", line 1483, in __init__
param_decls or (), expose_value
File "/home/user/.local/lib/python3.5/site-packages/click/core.py", line 2019, in _parse_decls
" {}".format(len(decls))
TypeError: Arguments take exactly one parameter declaration, got 2
Bagaimana cara membuat perintah untuk menerima 2 argumen dalam metode ini? Apakah saya melakukan kesalahan di suatu tempat? Bantuan akan sangat dihargai.
Saya melihat beberapa solusi yang menggunakan BluePrint dan saya tidak ingin menggunakan Blueprint untuk menjalankan pekerjaan saya! Kode di atas sederhana dan nyaman digunakan. Saya tidak tahu di mana dan apa yang saya lakukan salah !! Bantuan ekstra sangat dihargai !!
Jawaban
@click.arguments
tidak menerima banyak parameter dengan cara ini.
Sebagai gantinya, gunakan
@app.cli.command()
@click.argument('x', nargs=1)
@click.argument('y', nargs=1)
def power(x, y):
print(int(x)**int(y))
Lihat dokumentasi di sini .