2017-01-26 5 views
0

Можно ли передать ключевое слово = значение в качестве аргумента функции, где значение является аргументом из другой функции?NameError: имя не определено при использовании keyword = value

Например

Я определяю upper_dir

upper_dir='/somefolder' 

Я определяю мой рабочий реж:

def get_dir(): 

    repo_path = subprocess.call(["pwd"]) 
    return repo_path 

я прохожу upper_dir функции create_branch:

branch = gitmods.create_branch(hostname, upper_dir) 

Теперь create_ филиал должен вызвать SYSCMD функцию, передавая ее new_branch и upper_dir:

def create_branch(hostname, upper_dir): 

    random = randint(100000, 999999) 
    new_branch = 'git checkout -b removes-node-{0}'.format(random) 
    syscmd(new_branch, upper_dir) 

    repo_branch = 'git branch | grep "*"' 
    branch = syscmd(repo_branch) 
    branch = branch.split()[1] 
    return branch 

Некоторые другие функции вызывают SysCmd, но они только передать ему 1 аргумент. Я пытаюсь получить «УХО =» по умолчанию значения, содержащегося upper_dir

def syscmd(command, current_dir=upper_dir): 

    current_dir=str(get_dir()) 
    popen = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=current_dir) 
    out, err = popen.communicate() 
    out = out.rstrip() 
    return out 

Если SysCmd функция не получила upper_dir, я хочу, чтобы по умолчанию значения от get_dir (который является текущий каталог линукса в результате pwd

насколько я могу сказать, питон может получить ключевое слово = аргументы значения для функции, и по умолчанию для определенного значения, если не предусмотрен никаких аргументов. Но что происходит, когда ваш аргумент не строка, но вместо этого аргумент от другой функции?

Я получаю эту ошибку:

def syscmd(command, current_dir=upper_dir): 
NameError: name 'upper_dir' is not defined 
+1

'upper_dir' не определяется, когда файл скомпилирован. –

+0

Как я могу решить это, когда upper_dir определен в __main__, но функции, которые он передает, находятся в модуле? – ARL

+0

Как и в стороне, 'os.getcwd()' также получает текущий рабочий каталог. – tdelaney

ответ

3

Обычный подход заключается в установке по умолчанию параметра к None и проверить его с помощью if заявление:

def syscmd(command, current_dir=None): 
    if current_dir is None: 
     current_dir = str(get_dir()) 
    popen = subprocess.Popen(command, 
          shell=True, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE, 
          cwd=current_dir) 
    out, err = popen.communicate() 
    out = out.rstrip() 
    return out 
+0

Удивительный, спасибо. – ARL

2

Вы можете сделать это еще проще. Popen по умолчанию для текущего рабочего каталога, если cwd - None, и вы можете использовать одно и то же правило.

def syscmd(command, cwd=None): 
    popen = subprocess.Popen(command, 
          shell=True, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE, 
          cwd=cwd) 
    out, err = popen.communicate() 
    out = out.rstrip() 
    return out 

Если ваша команда сделала путь манипуляции как os.path.join, вы можете использовать «» по умолчанию

def syscmd(command, cwd='.'): 
    some_subpath = os.path.join(cwd, 'foo', 'bar') 
    ... 
Смежные вопросы