mirror of
https://github.com/m-lamonaca/dev-notes.git
synced 2025-04-07 19:36:40 +00:00
75 lines
1.7 KiB
Markdown
75 lines
1.7 KiB
Markdown
# [Click](https://click.palletsprojects.com) Lib
|
||
|
||
## Command Creation
|
||
|
||
```py
|
||
import click
|
||
|
||
# the decorator converts the function into a Command which then can be invoked
|
||
@click.command()
|
||
def hello():
|
||
click.echo('Hello World!')
|
||
|
||
if __name__ == '__main__':
|
||
hello()
|
||
```
|
||
|
||
### Nesting Commands
|
||
|
||
Commands can be attached to other commands of type `Group`. This allows arbitrary nesting of scripts. As an example here is a script that implements two commands for managing databases:
|
||
|
||
```py
|
||
@click.group()
|
||
def cli():
|
||
pass
|
||
|
||
@click.command()
|
||
def initdb():
|
||
click.echo('Initialized the database')
|
||
|
||
@click.command()
|
||
def dropdb():
|
||
click.echo('Dropped the database')
|
||
|
||
cli.add_command(initdb)
|
||
cli.add_command(dropdb)
|
||
```
|
||
|
||
The `group()` decorator works like the `command()` decorator, but creates a Group object instead which can be given multiple subcommands that can be attached with `Group.add_command()`.
|
||
|
||
For simple scripts, it’s also possible to automatically attach and create a command by using the `Group.command()` decorator instead.
|
||
The above script can instead be written like this:
|
||
|
||
```py
|
||
@click.group()
|
||
def cli():
|
||
pass
|
||
|
||
@cli.command()
|
||
def initdb():
|
||
click.echo('Initialized the database')
|
||
|
||
@cli.command()
|
||
def dropdb():
|
||
click.echo('Dropped the database')
|
||
```
|
||
|
||
You would then invoke the Group in your setuptools entry points or other invocations:
|
||
|
||
```py
|
||
if __name__ == '__main__':
|
||
cli()
|
||
```
|
||
|
||
### Adding Parameters
|
||
|
||
To add parameters, use the `option()` and `argument()` decorators:
|
||
|
||
```py
|
||
@click.command()
|
||
@click.option('--count', default=1, help='number of greetings')
|
||
@click.argument('name')
|
||
def hello(count, name):
|
||
for x in range(count):
|
||
click.echo(f'Hello {name}!')
|
||
```
|