应该如何调用这个Python函数

时间:2011-03-22 02:07:01

标签: python function scripting modularity

我无法正确引用最近添加的fpath()函数。代码以命令行的形式从文件,通配符或文件夹的形式获取参数,以便在最后一个代码块中使用。

#! /usr/bin/env python
import os, sys, glob
from optparse import OptionParser

#logic to determine if argument is a file, folder or wildcard
def fpath(arguments):
    files = []
    for arg in arguments:
        if '*' in arg or '?' in arg:
            # contains a wildcard character
            all_files.extend(glob.glob(arg))
        elif os.path.isdir(arg):
            # is a dictionary
            all_files.extend(glob.glob(os.path.join(arg, '*')))
        elif os.path.exists(arg):
            # is a file
            all_files.append(arg)
        else:
            # invalid?
            print '%s invalid' % arg
    return files

def main():

# List files in directory and upload them
    all_files = ''
    all_files = fpath(filename)
    for filename in all_files:
        #skip all directory entries which are not a file
        if not os.path.isfile(filename):
              continue
        k.set_contents_from_filename(filename, cb=percent_cb, num_cb=10)

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:2)

以下代码模式存在一些问题:

all_files = ''
def fpath(arguments):
    all_files = []
    # modify all_files
    return all_files 

您希望将all_files的内容传回给来电者。有两种常规方法可以做到这一点,使用全局变量和返回值:

全局变量

要使用全局变量,您需要告诉Python您将使用global语句从函数内修改全局变量:

all_files = ''
def fpath(arguments):
    global all_files
    all_files = []
    # modify all_files

在这种情况下,您也不需要return,因为全局变量中的调用者可以使用结果。

返回值

更好的方法可能是让函数返回all_files

def fpath(arguments):
    files = []
    # modify files
    return files

all_files = fpath(filename)

这消除了全局变量的使用,这通常被认为是不良实践,容易出错和混淆。我还将fpath函数中的数组名称更改为files,以澄清filesall_files确实是不同的变量。 可以具有相同的名称,但它们仍然是两个不同的变量。