2014-11-12 2 views
2

Я работаю над своим первым скриптом python. Я хочу использовать переменную внутри обратного вызова функции:Пропустить аргумент для обратного вызова?

def run(self, edit): 
    gitFolder = os.path.basename(gitRoot) 
    #Get branch 
    self.run_command(['git', 'rev-parse','--abbrev-ref','HEAD'], self.branchDone) 


def branchDone(self, result): 
    build = "./Build-Release.ps1 " + gitFolder + " " + result +" -Deploy;" 
    print build 

Как сделать gitFolder доступны для метода branchDone?

+0

возвращение gitFolder - после 'self.run_command (...)' в определении 'run (...)' функции. Попробуй это. Кроме того, вы можете добавить gitFolder в качестве аргумента в свой 'branchDone (self, result, gitFolder)', где вы можете передать его. В противном случае просто объявите gitFolder глобально и используйте его в обеих функциях. – ha9u63ar

+0

nope, Файл «. \ Panagora.py», строка 40, в branchDone NameError: глобальное имя «gitFolder» не определено – Himmators

+0

Я бы предположил, что это потому, что возврат не выполнялся при запуске branchDone. – Himmators

ответ

2

просто возвращают gitFolder из run и вызвать run в branchcode Попробуйте это: -

def run(self, edit): 
    gitFolder = os.path.basename(gitRoot) 
    #Get branch 
    self.run_command(['git', 'rev-parse','--abbrev-ref','HEAD'], self.branchDone) 
    return gitFolder 

def branchDone(self, result): 
    build = "./Build-Release.ps1 " + run() + " " + result +" -Deploy;" #run() returns gitfolders 
    print build 

Существует еще один способ

def run(self, edit): 
     self.gitFolder = os.path.basename(gitRoot) 
     #Get branch 
     self.run_command(['git', 'rev-parse','--abbrev-ref','HEAD'], self.branchDone) 


    def branchDone(self, result): 
     build = "./Build-Release.ps1 " + self.gitFolder + " " + result +" -Deploy;" 

Но это несет в себе проблему, которую вы должны выполнить функцию run перед выполнением branchcode, иначе self.gitfolder будет не определено и поднять Attribute error.

+1

Я думаю, что это должно быть self.run(), но кроме этого, отлично! – Himmators

+0

@KristofferNolgren Я думаю, что я ответил на ваш вопрос, проверьте обновленный код. –

+0

Да, это здорово, мне просто нужно было подождать, пока я не смог подтвердить! – Himmators

1

Как я наблюдаю, это методы класса, вы можете определить атрибут класса для совместного использования gitFolder через них.

def run(self, edit): 
    self.gitFolder = os.path.basename(gitRoot) 
    #Get branch 
    self.run_command(['git', 'rev-parse','--abbrev-ref','HEAD'], self.branchDone) 


def branchDone(self, result): 
    build = "./Build-Release.ps1 " + self.gitFolder + " " + result +" -Deploy;" 
    print build 
+1

это методы класса, без причины использовать глобальные. – jwillis0720

1

Один из способов будет использовать functools.partial:

def run(self, edit): 
    gitFolder = os.path.basename(gitRoot) 
    #Get branch 
    callback = functools.partial(self.branchDone, gitFolder) 
    self.run_command(['git', 'rev-parse','--abbrev-ref','HEAD'], callback) 

def branchDone(self, gitFolder, result): 
    build = "./Build-Release.ps1 " + gitFolder + " " + result +" -Deploy;" 
    print build 
1

Если вам не нужно branchDone для как обратный вызов, за исключением, рассмотреть вопрос об определении его в качестве закрытия внутри run:

from subprocess import check_output 

def run_command(command, callback): 
    callback(check_output(command).strip()) 

class Foo(object): 
    def run(self, edit): 
     gitFolder = "some_magic" 
     def branch_done(result): 
      print "./Build-Release.ps1 " + gitFolder + " " + result + " -Deploy;" 
     run_command(['git', 'rev-parse','--abbrev-ref','HEAD'], branch_done) 

Foo().run("edit") 
Смежные вопросы