2017-01-26 5 views
0

キーワード=値を関数に引数として渡すことはできますか?値は別の関数の引数ですか?NameError:keyword = valueを使用しているときに名前が定義されていません

def get_dir(): 

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

私はcreate_branch関数にupper_dir渡す:

branch = gitmods.create_branch(hostname, upper_dir) 

今CREATE_私は私が私の作業ディレクトリを定義upper_dir

upper_dir='/somefolder' 

を定義する例

については

枝は、それがnew_branchとupper_dir渡し、実行したsyscmd関数を呼び出す必要があります。

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つの引数を渡します。 私はたsyscmd機能は、私はそれがある(get_dirから値をデフォルトにしたいupper_dir受信しなかった場合は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 

に含まれる値をデフォルトに「= CWD」を取得しようとしています現在のLinuxディレクトリpwd

私が知る限り、Pythonはキーワード=値の引数を関数に渡すことができ、引数が指定されていない場合はデフォルト値をとります。 しかし、文字列ではなく、別の関数からの引数?

私はこのエラーを取得しています:あなたはこれをより簡単に行うことができます

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 
+1

ファイルのコンパイル時に 'upper_dir'が定義されていません。 –

+0

upper_dirが__main__で定義されているが、渡されている関数がモジュール内にある場合、どうすれば解決できますか? – ARL

+0

また、 'os.getcwd()'も現在の作業ディレクトリを取得します。 – tdelaney

答えて

3

通常のアプローチは、Noneにパラメータのデフォルトを設定し、ifステートメントを使用して、それをチェックすることです。 Popenは、cwdNoneの場合、現在の作業ディレクトリがデフォルトであり、同じルールを使用できます。

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') 
    ... 
+0

素晴らしいです、ありがとうございます。 – ARL

2

def syscmd(command, current_dir=upper_dir): 
NameError: name 'upper_dir' is not defined 
関連する問題