Uwielbiam moduł argparse
. Pomocne jest również argparse.FileType
, chyba że chcesz, aby wartość domyślna była inna niż sys.std*
, ponieważ tworzony jest domyślny plik wyjściowy, nawet jeśli podasz wartość .Jak zatrzymać argparse.FileType tworząc plik określony jako domyślny
Na przykład:
parser.add_argument('--outfile', type=FileType('w'), default="out.txt")
stworzy out.txt nawet jeśli określony plik z --outfile.
Najlepszym mogę wymyślić jest:
class MagicFileType(object):
def __init__(self, *args, **kwargs):
# save args/kwargs and set filetype to None
self.filetype = None
self.args = args
self.kwargs = kwargs
def __getattr__(self, attr):
""" Delegate everything to the filetype """
# If we haven't created it, now is the time to do so
if self.filetype is None:
self.filetype = FileType(*self.args, **self.kwargs)
self.filetype = self.filetype(self.filename)
return getattr(self.filetype, attr)
def __call__(self, filename):
""" Just cache the filename """
# This is called when the default is created
# Just cache the filename for now.
self.filename = filename
return self
Ale jeśli czuje się jak to powinno być łatwiej, ja czegoś brakuje?
Chociaż bardzo lubię swoje pytanie i rozwiązanie, nie mogę odtworzyć tego. Zrobiłem mały przykład, a kiedy podam '--outfile', otrzymam tylko plik określony przeze mnie, a nie oba. Jakiej wersji python się używasz? Może to błąd w module 'argparse' dla pewnej wersji. Jestem na 2.7.5 – Brian
To interesujące, @ Brian. [Ten program] (http://ideone.com/gC9F0t) potwierdza moją instalację 2.7.3 i moją 3.2.3. –
możliwy duplikat [Określanie domyślnych nazw plików z argparse, ale nie otwieranie ich na --help?] (Http://stackoverflow.com/questions/8236954/specifying-default-filenames-with-argparse-but-not-opening- one-on-help) –