2012-04-07 1 views
0

Dans le module optparse, j'ai une option qui prend une valeur de chemin (disons build). Problème: Je vérifie si cette option est None mais son échec si on passe --build = None. Motif: La raison en est le type par défaut pour optparse est une chaîne, donc il définit build = 'None' i.e comme type de chaîne avec la valeur None.Comment traiter une entrée de chaîne comme 'None' comme non-type

Une méthode consiste à utiliser la méthode eval() mais il échoue si quelqu'un fournit un chemin légitime Ou je pouvais faire si la construction ou build.lower() == « none »:

Mais je Ve pour le faire pour toutes les autres options qui, par défaut, prennent des entrées de chaîne. Y a-t-il un meilleur moyen? Veuillez aviser.

+0

Je pense que vous pouvez mapper les entrées 'CHAINE' à fonctionner en utilisant un' dictionary', dès que ce n'est pas 'none', vous pouvez rechercher dans votre' dictionary' pour voir ce 'function' à appel. Mais comme c'est de l'argument de la ligne de commande, je pense qu'il vaut mieux s'en tenir à 'optparse', ou même' argparse': http://docs.python.org/library/argparse.html#module-argparse – George

+0

Pouvons-nous voir le code? ? –

Répondre

2

Je suis un peu confus quel est le problème ... Voici un code que j'ai mis ensemble.

>>> import optparse 
>>> import shlex 
>>> parser = optparse.OptionParser() 
>>> parser.add_option('--build',type=str,default=None) 
<Option at 0x...: --build> 

Indiquez l'option --build sur la ligne de commande.

>>> options, args = parser.parse_args(shlex.split("--build=None")) 
>>> print options 
{'build': 'None'} 
>>> options.build is None 
False 
>>> options, args = parser.parse_args(shlex.split("")) 

Aucune option ne --build donnée sur "ligne de commande"

>>> print options 
{'build': None} 
>>> options.build is None 
True 

Comme vous pouvez le voir, si --build ne figure sur la ligne de commande, sa valeur par défaut None (à savoir un objet de type NoneType). Si build est fourni et la chaîne == "None", elle renvoie une chaîne "None".

Si vous insistez pour passer --build=None sur la ligne de commande, alors il est un peu ambigu ce que vous voulez que optparse fasse avec ce drapeau. S'il s'agit d'un chemin par exemple, vous pouvez écrire une fonction pour vérifier si le chemin n'existe pas: par ex.

import os.path 
def path_exists(p): 
    if(os.path.exists(p)): return p 
    else: return None 
... 
parser.add_option('--build',type=path_exists,default=None) 

Bien sûr, path_exists peut être aussi compliqué que vous le souhaitez pour votre application.

0

Si pour une raison quelconque, la réponse de mgilson n'est pas utile, parce que vous avez besoin de la valeur par défaut pour être autre chose que None ou une autre non-valeur évidente; Par exemple, si vous voulez que le defautl soit quelque chose comme ~/.foorc, une solution que j'ai tendance à utiliser est d'ajouter à la place une autre option «éteignez-la», en la préfixant habituellement avec une négation.

>>> import optparse 
>>> import shlex 
>>> parser = optparse.OptionParser() 
>>> parser.add_option('--build', type=str, default="~/.foorc") 
<Option at 0x...: --build> 
>>> parser.add_option('--no-build', 
...     dest="build", 
...     action="store_const", 
...     const=None) 
<Option at 0x...: --no-build> 

défaut sensées, les options sont facultatives, après tout

>>> options, args = parser.parse_args(shlex.split("")) 
>>> print options 
{'build': '~/.foorc'} 
>>> options.build 
'~/.foorc' 

peut être désactivé avec l'option --no-build:

>>> options, args = parser.parse_args(shlex.split("--no-build")) 
>>> print options 
{'build': None} 
>>> options.build is None 
True 

Bien sûr, vous pouvez toujours remplacer la valeur par défaut.

>>> options, args = parser.parse_args(shlex.split("--build=something")) 
>>> print options 
{'build': 'something'} 
>>> options.build 
'something' 
Questions connexes