วิธีสร้างคำสั่ง Flask CLI แบบกำหนดเองที่มี 2 อาร์กิวเมนต์ขึ้นไป

Aug 15 2020

ฉันต้องการสร้างคำสั่ง Flask CLI แบบกำหนดเอง ใช้งานได้ดีเมื่อฉันใช้กับอาร์กิวเมนต์ 1 รายการเท่านั้น แต่ใช้ไม่ได้กับ 2 อาร์กิวเมนต์ขึ้นไป ฉันใช้รหัสด้านล่างและล้มเหลวสำหรับ 2 อาร์กิวเมนต์ขึ้นไป:

# Usage: flask power 2 3 
# Output: 6
@app.cli.command()
@click.argument('x','y')
def power(x, y):
  print(int(x)**int(y))

โค้ดต่อไปนี้ทำงานได้ดีโดยมีพารามิเตอร์เพียง 1 ตัว

# Usage: flask power 2
# Output: 6
@app.cli.command()
@click.argument('x')
def power(x):
  print(int(x)**3)

ข้อผิดพลาดที่เกิดขึ้นกับรหัสอาร์กิวเมนต์ 2 รายการขึ้นไปคือ:

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

ฉันจะสร้างคำสั่งเพื่อยอมรับ 2 อาร์กิวเมนต์ในวิธีนี้ได้อย่างไร ฉันทำผิดพลาดที่ไหนสักแห่ง? ความช่วยเหลือจะได้รับการชื่นชมอย่างมาก

ฉันเห็นโซลูชันบางอย่างที่ใช้ BluePrint และฉันไม่ต้องการใช้ Blueprint เพื่อให้งานของฉันทำงาน! รหัสข้างต้นใช้งานง่ายและสะดวก คิดไม่ออกว่าทำผิดตรงไหน !! ขอความช่วยเหลือเป็นพิเศษ !!

คำตอบ

2 KusalHettiarachchi Aug 15 2020 at 22:07

@click.arguments ไม่ยอมรับหลายพารามิเตอร์ด้วยวิธีนี้

ให้ใช้ไฟล์

@app.cli.command()
@click.argument('x', nargs=1)
@click.argument('y', nargs=1)
def power(x, y):
    print(int(x)**int(y))

โปรดดูเอกสารประกอบที่นี่