[PYTHON] Définissez un type d'argument personnalisé avec un clic (Exemple: Implémentation d'un type qui fait d'une chaîne eval une valeur optionnelle)

Cliquez sur vous permet de définir et d'utiliser des types d'arguments personnalisés. → http://click.pocoo.org/6/parameters/#implementing-custom-types

Méthode

Créez une classe qui hérite de click.ParamType et remplace convert (). Si la valeur renvoyée par convert () est None, cette valeur (et via ce convert ()) sera la valeur facultative si l'argument par défaut est défini.

Exemple) Un type qui fait d'une version eval d'une chaîne de caractères une valeur facultative

Dans l'exemple d'implémentation suivant, seules les chaînes de caractères sont renvoyées sans eval et les chaînes de caractères qui ne peuvent pas être eval sont renvoyées brutes. S'il contient des blancs, citez-le et transmettez-le. Les chaînes de caractères développées dans le shell doivent être échappées ou conçues.

eval_param_type.py


# -*- encoding: utf-8 -*-
import click

class EvalParamType(click.ParamType):
    def convert(self, value, param, ctx):
        if not isinstance(value, str):
            return value
        try:
            return eval(value)
        except:
            return value  # raw string


@click.command()
@click.option('--p', type=EvalParamType(), default={0:1, 2:3})
##Passez une instance de la classe dans le mot-clé type
def main(**kwargs):
    if 'p' in kwargs:
        print 'kwargs:', kwargs
        p = kwargs['p']
        print p.__class__, p


if __name__ == '__main__':
    main()

j'essaierai

$ python eval_param_type.py 
kwargs: {'p': {0: 1, 2: 3}}
<type 'dict'> {0: 1, 2: 3}

$ python eval_param_type.py --p "Hello"
kwargs: {'p': 'Hello'}
<type 'str'> Hello

$ python eval_param_type.py --p "'Hello, world'"
kwargs: {'p': 'Hello, world'}
<type 'str'> Hello, world

$ python eval_param_type.py --p hello
kwargs: {'p': 'hello'}
<type 'str'> hello

$ python eval_param_type.py --p 3.14
kwargs: {'p': 3.14}
<type 'float'> 3.14

$ python eval_param_type.py --p 5
kwargs: {'p': 5}
<type 'int'> 5

$ python eval_param_type.py --p -3
kwargs: {'p': -3}
<type 'int'> -3

$ python eval_param_type.py --p True
kwargs: {'p': True}
<type 'bool'> True

$ python eval_param_type.py --p 1+2
kwargs: {'p': 3}
<type 'int'> 3

$ python eval_param_type.py --p []
kwargs: {'p': []}
<type 'list'> []

$ python eval_param_type.py --p "()"
kwargs: {'p': ()}
<type 'tuple'> ()

$ python eval_param_type.py --p None
kwargs: {'p': {0: 1, 2: 3}}
<type 'dict'> {0: 1, 2: 3}
//Évaluez «Aucun» pour devenir Aucun et allez voir la valeur définie dans l'argument par défaut

Recommended Posts

Définissez un type d'argument personnalisé avec un clic (Exemple: Implémentation d'un type qui fait d'une chaîne eval une valeur optionnelle)
argument de conversion $ 1 type: type non pris en charge [] chaîne, une tranche de chaîne
Format lors du passage d'une longue chaîne comme argument de python
Fonction Eval () qui calcule une chaîne de caractères comme expression en python
Implémenter un modèle avec état et comportement (3) - Exemple d'implémentation par décorateur