2016-08-11 5 views
1

Nachdem ich viele Python-Skripte mit den gleichen Tensorflow-FLAGS verwendet hatte, war ich es leid, mehrere Flags für jede Änderung zu aktualisieren und beschloss daher, tf.app.flags in eine separate Klasse umzuwandeln, die ich in Skripten wiederverwenden konnte.Refactoring Tensorflow FLAGS

Allerdings, aus irgendeinem seltsamen Grund, wenn ich self.flags in einer anderen Methode verwenden, kann es ein zuvor gesetztes Flag nicht erkennen. Die folgende Klasse zum Beispiel wird für Flag project_dir2 gut funktionieren, aber für Flag project_dir3

`class MyClass(): 
    def __init__(self): 
    self.flags = tf.app.flags 
    self.FLAGS = self.flags.FLAGS 

    #test code that works here 
    self.flags.DEFINE_string("project_dir2", "aValue", "project directory") 
    print("This will print correctly: "+self.FLAGS.project_dir2) 
    self.my_function() 

    def my_function(self): 
    #test code that fails 
    self.flags.DEFINE_string("project_dir3", "aValue", "project directory") 
    print("This will fail: "+self.FLAGS.project_dir3)` 

ich die folgende Ausnahme scheitern erhalten:

AttributeError: project_dir2 Exception TypeError: TypeError("'NoneType' object is not callable",) in <function _remove at 0x7fd4c3090668> ignored

Gibt es etwas offensichtlich, dass ich falsch mache? Oder ist das mit Tensorflow-Flaggen einfach nicht möglich? Bedeutet dies, dass es keine Möglichkeit gibt, häufig verwendete Flag-Einstellungen in Skripten zu refactorisieren?

Antwort

0

Es scheint, es gibt eine interne Methode namens _parse_flags(), die on first access heißt. Man könnte es manuell aufrufen, nachdem Sie es

IE

def my_function(self): 
    #test code that fails 
    self.flags.DEFINE_string("project_dir3", "aValue", "project directory") 
    self.flags.FLAGS._parse_flags() 

Hintergrund auf tf.flags aktualisieren - es ist eine teilweise Neuimplementierung von gflags Bibliothek Google so dass es Funktionen/Dokumentation fehlt. Es ist ein Beitrag, um etwas klüger zu tun, wie zum Beispiel offizielle gflags (issue 1258). Das erlaubt Dinge wie die Steuerung der ausführlichen Protokollierung (die eine Neukompilierung erfordert right now)

+0

Vielen Dank! ! ! Funktioniert jetzt perfekt. Du bist gerade dabei, mir einige Stunden Arbeit zu ersparen :-) Prost – user1400916