2017-09-06 4 views
1


Ich mag meinen Python-Skript arbeitet wie unten machen:Wie erreiche ich die folgende Funktionalität mit argparse?

  • example.py -a Zahl
  • example.py -a -f Eingabedatei

So ersten Befehl sollte nur eine Zahl nehmen und etwas tun.
Aber der zweite Befehl sollte

Zum Beispiel Zahlen aus der Datei (.txt) und das gleiche tun Maßnahmen ergreifen: die Anzahl und Drucke auf dem Bildschirm
-a
-a Zahl Option liest - f Eingabedatei
sollte auch die Zahlen lesen und auf dem Bildschirm drucken, aber aus der TXT-Datei (die mehrere Zahlen haben kann)

Ist es möglich?
Wenn nicht, schlagen Sie bitte einen besten Weg vor. Danke

+0

Warum brauchen Sie das -a für den 2. Fall? -f sollte ausreichen. – sureshvv

+0

weil das Skript auch etwas anderes tut, also möchte ich mit -a diese Funktionalität unterscheiden. Aber ich will zwei verschiedene Eingabemöglichkeiten dafür –

+0

Du kannst nargs = setzen? beim Aufruf von add_argument für -a – sureshvv

Antwort

1

Ihre Idee macht keinen Sinn von der Benutzer Seite der Dinge.

Bedeutung: Wenn Sie sagen, -f muss der Benutzer bereits verstehen, dass das Tool die entsprechende Datei öffnen und Prozess es wird. Daher sollten Sie ihn nicht bitten, -a zusätzlich zur Verfügung zu stellen.

Aber natürlich können Sie es tun. Was ich hier tun würde: einen Standard Wert für den -a Schalter zur Verfügung stellen, wie beschrieben here zum Beispiel.

Dann kann Ihr Skript prüfen, ob Standard Wert verwendet wird. Und dann können Sie Entscheidungen auf dieser Grundlage machen, wie in:

  • wenn -a hat seinen Wert Ausfall- und -f gegeben: aus der Datei lesen und tun, was -a damit machen sollte
  • wenn -a haben nicht den Standard Wert und -f ist gegeben: ??? (Sie haben zu denken, was das bedeutet)
  • ...

Diejenigen, ... sind ein Symptom, warum ich Ihren Ansatz berücksichtigen nicht elegant sein: es kompliziert wirklich das ganze Argument Handling massiv. Ich würde einfach gehen für oder-f file und nicht erlauben für diejenigen, die gemischt werden. Sie sehen, jede Schnittstelle sollte es einfach machen, um das Richtige zu tun, und hart, um die falsche Sache zu tun. Das Zulassen von Kombinationen von Flags/Switches führt einfach zu einer Explosion von möglichen Pfaden. Und das bedeutet, dass Sie sich mit allen befassen müssen, und der Benutzer muss sich an diejenigen erinnern, die tatsächlich gültig sind.

Und Ihren Kommentar gegeben: Natürlich könnten Sie dies vereinheitlichen, um nehmen entweder eine Zahl oder eine Zeichenfolge, die einen Dateinamen.

Dann weisen Sie einfach Argarse, dass speichert Zeichenfolge Werte. Dann kann Ihr Skript entscheiden, ob diese Zeichenfolge eine Nummer oder einen gültigen Dateinamen ist. Um dann zu tun, was notwendig ist. Etwas wie dieses:

from __future__ import print_function 
import os.path 
import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument("-a", "--add", 
        help="whatever", 
        type=str) 
args = parser.parse_args() 

if args.add: 
    if args.add.isdigit(): 
     print("input contains only digits: {}".format(args.add)) 
    else: 
     print("input contains other stuff: {}".format(args.add)) 
     if os.path.isfile(args.add): 
      print("input is a valid file name!") 
+0

oh! Danke für das Erklären im Detail –

+0

sicher! schnelle Frage, kann eine einzelne Option Wert von der Befehlszeile und einer Datei nehmen. Ich meine, in meinem Fall - kann ich nur -a, und Benutzer kann entweder Nummer von der Befehlszeile eingeben oder die Datei mit allen Zahlen? –

+0

Sicher - siehe meine Updates. – GhostCat

Verwandte Themen