NameError:使用keyword = value时未定义name

时间:2017-01-26 16:16:43

标签: python python-2.7

是否可以将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_branch需要调用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个参数。 我试图让'cwd ='默认为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

产生的当前linux目录

据我所知,python可以接收函数的keyword = value参数,并且在没有提供参数时默认为特定值。 但是当你的参数不是一个字符串,而是来自另一个函数的参数时会发生什么呢?

我收到了这个错误:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

你可以更简单地做到这一点。如果Popencwd,则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')
    ...