[PYTHON] Definieren Sie einen benutzerdefinierten Argumenttyp mit einem Klick (Beispiel: Implementierung eines Typs, der eine Bewertungszeichenfolge zu einem optionalen Wert macht)

Mit Click können Sie benutzerdefinierte Argumenttypen definieren und verwenden. → http://click.pocoo.org/6/parameters/#implementing-custom-types

Methode

Erstellen Sie eine Klasse, die von click.ParamType erbt und convert () überschreibt. Wenn der von convert () zurückgegebene Wert None ist, ist dieser Wert (und über diese convert ()) der optionale Wert, wenn das Standardargument festgelegt ist.

Beispiel) Ein Typ, der eine Evaluierungsversion einer Zeichenfolge zu einem optionalen Wert macht

Im folgenden Implementierungsbeispiel werden nur Zeichenfolgen ohne Auswertung zurückgegeben, und Zeichenfolgen, die nicht ausgewertet werden können, werden roh zurückgegeben. Wenn es Leerzeichen enthält, zitieren Sie es und übergeben Sie es. Zeichenketten, die auf die Shell erweitert werden, müssen maskiert oder entwickelt werden.

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})
##Übergeben Sie eine Instanz der Klasse im Schlüsselwort type
def main(**kwargs):
    if 'p' in kwargs:
        print 'kwargs:', kwargs
        p = kwargs['p']
        print p.__class__, p


if __name__ == '__main__':
    main()

Ich werde es versuchen

$ 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}
//Bewerten Sie "Keine", um "Keine" zu werden, und sehen Sie sich den im Standardargument festgelegten Wert an

Recommended Posts

Definieren Sie einen benutzerdefinierten Argumenttyp mit einem Klick (Beispiel: Implementierung eines Typs, der eine Bewertungszeichenfolge zu einem optionalen Wert macht)
Konvertierungsargument $ 1 Typ: Nicht unterstützter Typ [] String, ein Stück String
Format, wenn eine lange Zeichenfolge als Python-Argument übergeben wird
Die eval () -Funktion, die eine Zeichenfolge als Ausdruck in Python berechnet
Implementieren Sie ein Modell mit Status und Verhalten (3) - Beispiel für die Implementierung durch den Dekorateur