2012-12-11 1 views
2

Y at-il un moyen de faire fonctionner ce qui suit? Ce que je cherche, c'est d'avoir une valeur d'une option, basée sur la valeur d'une autre.Python optparse, avoir une option dépend d'une autre

import optparse 
parser = optparse.OptionParser() 

parser.add_option("--file-name", default="/foo/bar", dest="file_name") 

parser.add_option("--file-action", 
    default="cp %s /bar/baz" % (options.file_name), 
    dest="fileaction") 

options, args = parser.parse_args() 

De toute évidence, comme il est à l'heure actuelle, il ne fonctionnera pas, car

variable locale « options » référencées avant l'affectation

+1

Le module 'optparse' est obsolète depuis Python 2.7. Vous pouvez envisager d'utiliser 'argparse' à la place (http://docs.python.org/dev/library/argparse.html) qui est également disponible pour Python 2.x:' pip install argparse' –

+0

merci pour le commentaire, cependant, changer le code courant ne figure pas dans la liste ;-) –

+1

Je ne pense pas que vous y ayez réfléchi, premièrement, l'action de fichier ne doit pas inclure le nom de fichier, sinon il n'y a aucune raison d'inclure un nom de fichier en tant que paramètre en premier lieu. aussi, si vous avez l'intention d'avoir un script qui reçoit un nom de fichier une action sur le fichier et ensuite exécute l'action sur le fichier, pourquoi ne pas simplement avoir 3 paramètres "nom de fichier" "file-command" "arguments-de-fichier "et ensuite simplement les assembler comme vous voulez? –

Répondre

1

ont juste les deux:

parser.add_option("--file-name", dest="file_name") 
parser.add_option("--file-action", dest="file_action") 

vous pouvez utiliser la logique simple.

if options.file_name: 
    #do code relating to file_action 

ou même

if options.file_action and not options.file_name: 
    raise ValueError("No Filename specified") 
# do your code here. 
+2

Il les a tous les deux ... –

0

Vous devrez masser la valeur par défaut plus tard. Si l'option est la valeur par défaut, puis procédez massant:

parser.add_option("--file-action", 
    default="cp <filename> /bar/baz", 
    dest="fileaction") 

options, args = parser.parse_args() 

if options.fileaction == "cp <filename> /bar/baz": 
    options.fileaction = "cp %s /bar/baz" % (options.file_name) 

Cela dit, dans cet exemple, fileaction et le nom semblent conflit, de sorte qu'il est inutile de mettre les deux en même temps, ils écrasent l'un l'autre d'une manière qui n'est pas évidente. Je laisserais le paramètre par défaut à "cp", et j'ajouterais un --action-target pour '/bar/baz' puis je construirais simplement l'appel à partir de ces pièces.

+0

Le seul problème avec cette solution est que la valeur '__default__' apparaîtra dans l'aide, ce qui la rendra un peu moche. –

+0

@DawidFatyga: Vrai. En fait, pensez-y, vous n'avez même pas besoin d'un marqueur. Tant qu'il a résolu de défaut, cela fonctionnera. J'ai mis à jour la réponse en conséquence. –

+0

okay - que se passe-t-il quand il y a une action de fichier, comment sera-t-il réglé pour inclure le nom de fichier? - aussi, depuis quand peut-on passer des arguments à optparse avec des espaces séparant des mots du même argument? –

0

Votre analyseur est un gestionnaire. Il expliquera à Python ce que vous ferez avec la ligne de commande reçue lors du lancement du programme. Par conséquent, il est incorrect d'avoir une dépendance dans vos options.

Ce que je vous conseille, est de gérer le comportement par défaut dans votre code. Vous pouvez faire quelque chose comme:

parser.add_option("--file-action", 
default=None, 
dest="fileaction") 

options, args = parser.parse_args() 

# Manage the default behaviour 
if not options.fileaction: 
    fileaction = "cp %s /bar/baz" % (options.file_name) 
    # You could then use fileaction the way you would use options.fileaction 
Questions connexes