2017-05-20 4 views
0

Python Version: Python 3.5.1nimmt Parser immer Argumente als Liste?

Django Version: Django 1.10.2

Ich versuche, meinen eigenen django benutzerdefinierten Befehl zu schreiben, und ich bemerkte, dass in einem Argumente zu nehmen, es endet immer als einen nach oben Liste.

Siehe https://docs.python.org/3/library/argparse.html

Beachten Sie, dass die Argumente für ganze Zahlen ist eine Liste von Integer.

Ich wollte ein Argument haben, das einen relativen Pfad oder absoluten Pfad zu einem Verzeichnis einbezieht, das im offensichtlich str-Format geschrieben ist.

Meine Frage ist:

  1. es sogar möglich, das Argument als einzelnes str Objekt für das Parser-Objekt nur zu akzeptieren?
  2. Wenn es möglich ist, was muss ich ändern?

Mein aktueller Code ist

def add_arguments(self, parser): 
    parser.add_argument('path', nargs='+', type=str) 

    # Named (optional) arguments 
    parser.add_argument(
     '--whiteware', 
     action='store_true', 
     dest='whiteware', 
     default=True, 
     help='Affects whiteware variants only', 
    ) 

def handle(self, *args, **options): 
    directory_in_str = options['path'] 

    print(directory_in_str) 
+1

lesen, was ist das Ziel? Können Sie ein Beispiel für eine gültige Eingabe und ein Beispiel für eine ungültige Eingabe als Teil der Frage anzeigen? Das 'nargs = '+'' ist das, was die Eingabe als String annimmt. Entfernen Sie das, und Sie sollten die Argumente als Zeichenfolge abrufen. – karthikr

+0

@Exprator, wenn ich Ihren Kommentar downvote könnte ich. Ich erstelle bereits die benutzerdefinierte Befehlsdatei.Ich spreche speziell über das Parser-Objekt innerhalb der benutzerdefinierten Befehlsklasse –

+0

Dank @ Carthikr Ihr Kommentar war die richtige Richtung, die ich brauchte. Vielen Dank. Fühlen Sie sich frei, eine Antwort zu erstellen, damit ich es als richtig markieren kann. –

Antwort

1

Ihr Problem mit der Art und Weise wird man das Kommandozeilenargument path erstellen.

Aus der Dokumentation,

nargs - Die Anzahl der Befehlszeilenargumente, die verbraucht werden sollte.

und nargs='+' impliziert einen oder mehrere Leerzeichen getrennt Argumente, die von argparse in eine Liste gegossen werden würde.

Nun, wenn Sie eine Zeichenfolge erwarten, können Sie einfach tun:

parser.add_argument('path', type=str) #type is str by default, no need to specify this explicitly. 

Beachten Sie, dass nargs äußerst nützlich ist, wenn Sie die Wahl Typen einschränken möchten, usw.

Zum Beispiel:

parser.add_argument('path', nargs='+', choices=['a', 'b', 'c']) 

Auf diese Weise können Sie eine Reihe von Optionen zur Verfügung stellen, die als Liste für den Verbrauch verfügbar wären.

Oder auch:

parser.add_argument('path', choices=['a', 'b', 'c']) 

Wenn Sie eine einzelne Option als String möchten.

Sie können mehr über argparse options here in the documentation

Verwandte Themen