如何在其他功能中使用列表?

时间:2016-04-12 20:58:33

标签: python python-2.7

我在函数中有一个像这个cs_id["CS_A1","CS_b7",...]的列表。在函数结束时,列表中填充了80个值。如何在另一个函数中使用此列表(和值)?在这里,我想在函数cs_id[]中使用函数unzip中的列表changecs。 (顺便说一下,第二个功能还没有准备好。)

更新

我还是不明白......不知道为什么。

这是我的完整代码......也许有人可以提供帮助。

maker.py

#!/usr/bin/python

import getopt
import sys
import functions as func

ifile = ''
ofile = ''
instances = 0

def main(argv):
    try:
        opts, args = getopt.getopt(argv, "hi:o:n:d", ["help", "ifile=", "ofile=", "NumberOfInstances="])
    except getopt.GetoptError:
        func.usage()
        sys.exit(2)

    for opt, arg in opts:
        if opt in ("-h", "--help"):
            func.usage()
            sys.exit()
        elif opt in '-d':
            global _debug
            _debug = 1
        elif opt in ("-i", "--ifile"):
            global ifile
            ifile = arg
        elif opt in ("-o", "--ofile"):
            global ofile
            ofile = arg
        elif opt in ("-n", "--NumberOfInstances"):
            global instances
            instances = int(arg)

    func.unzip(ifile, instances)
    func.changecs()

if __name__ == "__main__":
    main(sys.argv[1:])

functions.py

import os
import zipfile
import sys
import string
import random

# printing usage of warmaker.py
def usage():
    print "How to use warmaker.py"
    print 'Usage: ' + sys.argv[0] + ' -i <inputfile> -o <outputfile> -n <NumberOfInstances>'

# creating random IDs for CS instance e.g. CS_AE, CS_3B etc.
def id_generator(size=2, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

# unzip the reference warfile and build n instances
def unzip(ifile, instances,):
    newinstance = ifile
    cs_id = []
    for i in xrange(instances):
        cs_id.append('CS_' + id_generator())
        i += 1
    print 'Searching for reference file ' + newinstance
    if os.path.isfile(newinstance):  # check if file exists
        print 'Found ' + newinstance
    else:
        print newinstance + ' not fonund. Try again.'
        sys.exit()
    print 'Building ' + str(instances) + ' instances... '
    for c in xrange(instances):
        extract = zipfile.ZipFile(newinstance)
        extract.extractall(cs_id[c])
        extract.close()
        print cs_id[c] + ' done'
        c += 1
    return cs_id

#def create_war_file():

def changecs(cs_id):
    n = 0
    for item in cs_id:
        cspath = cs_id[n] + '/KGSAdmin_CS/conf/contentserver/contentserver-conf.txt'
        if os.path.isfile(cspath):
            print 'contentserver-conf.txt found'
        else:
            print 'File not found. Try again.'
        sys.exit()
        n += 1
    #f = open(cspath)
    #row = f.read()

5 个答案:

答案 0 :(得分:1)

两种方式。

1 /以解压缩

返回列表
def unzip(ifile, instances):
    # No need for this global
    # global cs_id 

    cs_id = []
    # Do stuff
    # [...]

    # Return the list
    return cs_id

在这种情况下,您可以调用unzip并获取完整列表作为返回值:

def changecs(instances):

    # The following line is equivalent to
    # cs_id = unzip(ifile, instances) 
    # for c in cs_id:
    for c in unzip(ifile, instances):

        cspath = cs_id + '/abc/myfile.txt'

2 /将其作为参数传递并在解压缩时进行修改。

def unzip(ifile, instances, cs_id):
    # Do stuff
    # [...]

在这种情况下,您可以传递解压缩空列表并让它在适当位置进行修改:

def changecs(instances):

    cs_id = []

    unzip(ifile, instances, cs_id):

    for c in cs_id:

        cspath = cs_id + '/abc/myfile.txt'

我更喜欢第一种方法。无需提供解压缩空列表。如果你必须在现有的非空列表上调用unzip,第二种方法更适合。

编辑:

自编辑以来,unzip返回cs_idchangecs将其用作输入。

def unzip(ifile, instances,):
    [...]
    return cs_id

def changecs(cs_id):
    [....]

但你这样称呼他们:

func.unzip(ifile, instances)
func.changecs()  # This should trigger an Exception since changecs expects a positional argument

你应该像这样打电话给他们:

variable = func.unzip(ifile, instances)
func.changecs(variable)

或只是

func.changecs(func.unzip(ifile, instances))

答案 1 :(得分:0)

一种可能性是在函数外部初始化列表,然后在两者中调用它,我猜。

答案 2 :(得分:0)

你可以调用该函数并将其返回给另一个函数。不知道你想在哪里使用它,但作为一个例子,这是相同的概念

def foo():
    l = [1,3,2,5,4,6,5]
    l.append(10)

    return l

def bar():
    l = foo()
    print (l)

return终止函数,在你的情况下,你想把它放在函数的末尾。

答案 3 :(得分:0)

unzip返回值。从主要块中调用unzip。然后将返回值从unzip传递到changecs。简单。

def unzip(...):
   ...
   return cs_id

def changecs(cs_id, ...):
   ... do stuff with cs_id ...

if __name__ == "__main__":
   ... main block ... # This can be replaced with any kind of driver code

或者,您可以直接从unzip内拨打changecs(如果允许该流量)。

答案 4 :(得分:0)

代码就在那里。在def unzip()的底部,使用cs_id命令返回数组return。返回的数组可以存储在运行unzip()的函数的变量中。在这种情况下,它是我们的主要python函数。

在主函数中的变量中包含cs_id数组后,将其传递给changecs(),如:func.changecs(cs_id)

def main(argv)的最后两行编辑为:

cs_id = func.unzip(ifile, instances)
func.changecs(cs_id)

在上面的代码中,unzip(ifile, instances)返回我们的数组cs_id。我们将其作为参数传递给changecs(cs_id)