How to use namespace zurückgegeben parse_known_args?
Ich gerade Schreibe ein Python-Skript und versucht, dynamisch zu generieren, einige Argumente. Jedoch wird ein Fehler geworfen wird, für das folgende Skript unter Angabe 'Namespace' object is not iterable.
Irgendwelche Ideen auf, wie zu lösen?
import argparse
from os import path
import re
replacements = {}
pattern = '<<([^>]*)>>'
def user_replace(match):
## Pull from replacements dict or prompt
placeholder = match.group(1)
return (replacements[placeholder][0]
if placeholder in replacements else
raw_input('%s? ' % placeholder))
def main():
parser = argparse.ArgumentParser()
parser.add_argument('infile', type=argparse.FileType('r'))
parser.add_argument('outfile', type=argparse.FileType('w'))
required, extra = parser.parse_known_args()
infile, outfile = required.infile, required.outfile
args = re.findall(pattern, infile.read())
args = list(set(args))
infile.seek(0)
parser = argparse.ArgumentParser()
for arg in args:
parser.add_argument('--' + arg.lower())
replacements = vars(parser.parse_args(extra))
matcher = re.compile(pattern)
for line in args.infile:
new_line = matcher.sub(user_replace, line)
args.outfile.write(new_line)
args.infile.close()
args.outfile.close()
if __name__ == '__main__':
main()
Den Fehler mit dem Rückgabewert der parser.parse_known_args(). Irgendwelche Ideen auf, wie könnte ich dies umgehen, obwohl? Jemand schlug vor, erstellen Sie ein Objekt und mit der dict interface, aber ich weiß nicht, was dies genau zur Folge hat. Ich bin wirklich neu in Python, also ich verstehe nicht, warum (infile, outfile), extra = parser.parse_known_args() würde nicht funktionieren.
Edit: Aktualisiert mit zwei Korrekturen. Die erste fest-die oben genannten Fehler mit dem akzeptierten Antwort unten. Zweitens, auch es wurde ein Fehler behoben, ich war immer gekennzeichnet und versuchen, um das gleiche argument zweimal. Behoben, indem args ein Satz dann wieder eine Liste. Nun mein Skript läuft, aber die optionalen Argumente haben keine Wirkung. Irgendwelche Ideen?
- Bereits beantwortete diese auf Ihre ursprüngliche Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
ArgumentParser.parse_known_args
gibt eine namespace und eine Liste der restlichen Argumente. Namespaces sind nicht durchsuchbar, so dass, wenn Sie versuchen zu vergeben, um die Tupel(infile, outfile)
du dir das "nicht durchsuchbar" Fehler.Stattdessen sollten Sie so etwas schreiben
und dann Zugriff auf die geparsten Argumente als
namespace.infile
undnamespace.outfile
.Ich hatte ein ähnliches problem mit der parse_args () - Methode. Ich wollte den namespace als ein Wörterbuch. Da es aussieht wie ein dict, sollte es möglich sein!
vars()
ist der kanonische Weg, um zu konvertieren ein Objekt ist, Attribute zu einem dict...Eigentlich, dass code-Zeile sollte wie folgt lauten:
Anders, man bekommt immer noch die Fehlermeldung über namespaces nicht durchsuchbar.