Как должна вызываться эта функция Python - PullRequest
1 голос
/ 22 марта 2011

У меня проблема с правильной ссылкой на недавно добавленную функцию 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 Ответ

2 голосов
/ 22 марта 2011

Следующий шаблон кода имеет некоторые проблемы:

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, поскольку результат доступен вызывающей стороне в глобальной переменной.

Возвращаемое значение

Возможно, лучше использовать функцию return all_files:

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

all_files = fpath(filename)

Это исключает использование глобальной переменной, которая обычно считается плохой практикой и подвержена ошибкам и путанице. Я также изменил имя массива внутри функции fpath на files, чтобы уточнить, что files и all_files действительно разные переменные. Они могут иметь одно и то же имя, но все равно будут двумя разными переменными.

...