普通python脚本和函数之间的技巧?

2024-09-28 03:15:24 发布

您现在位置:Python中文网/ 问答频道 /正文

作为一个编程新手,我试着单独测试每个函数,确保它正常工作。 我的问题是:对于单一的简单测试,它是有效的;将它转换成函数并将它们组合成脚本,它们就不起作用了。
例如:

def getRigs (fileObj):
    fileObj.seek(0)
    rigList = []
    Tag = False
    for line in fileObj:
        if line.find("[BeginRigs]") != -1:
            Tag = True
        elif line.find("[EndRigs]") != -1:
            Tag = False
        elif Tag:
            rigList.append(line.strip())
    return (rigList)

def getObjects (fileObj):
    fileObj.seek(0)
    objList = []
    Tag = False
    for line in fileObj:
        if line.find("[BeginObjects]") != -1:
            Tag = True
        elif line.find("[EndObjects]") != -1:
            Tag = False
        elif Tag:
            objList.append(line.strip())
    return (objList)

def dummyRig (rigObj, objName):
    dummy = ""
    for rig in rigObj:
        with open(rig, "r") as infile:
            #rigObj.seek(0)
            Tag = None
            for line in infile:
                for obj in objName:
                    if line.find("ObjectAlias " + obj + "\n") !=-1:
                        Tag = "Mark"
                        dummy += line
                        break
                    elif line.find("BeginKeyframe") != -1:
                        if Tag == "Mark":
                            Tag = "Copy"
                        break
                    elif line.find("EndKeyframe") != -1:
                        if Tag == "Copy":
                            Tag = None
                            dummy += line
                        break
                if Tag == "Copy":
                    dummy += line
    return (dummy)

def getBlock (rigObj, objName):
    Tag = False
    block = ""
    for line in rigObj:
        if line.find("ObjectAlias " + str(objName) + "\n") != -1:
            for line in rigObj:
                if line.find("BeginKeyframe") != -1:
                    Tag = True
                elif line.lstrip().startswith("0.000 ") and line.rstrip().endswith("default"):
                    Tag = False
                    break
                elif Tag:
                    block += line
    return (block)

inputconfig = open("config.cfg", "r")
infile = sys.argv[1]
inputscene = open(infile, "r")
outfile = infile.split(".")[0] + "_updated.fxs"
outputscene = open(outfile, "w")

a_rigList = getRigs (inputconfig)
a_objList = getObjects (inputconfig)

a_dummyRig = dummyRig (a_rigList, a_objList)
#print a_dummyRig    #----> Output as expected
tmp = getBlock (a_dummyRig, a_objList)
outputscene.write(tmp)    #----> Gvie me empty output!

如果我单独测试“getBlock”函数,它可以正常工作:

with open("result_from_a_dummyRig", "r") as rigObj, open("result", "w") as output:
    Tag = False
    for line in rigObj:
        if line.find("ObjectAlias " + "rooster_bn_featherLa_rt_08" + "\n") != -1:
            for line in rigObj:
                if line.find("BeginKeyframe") != -1:
                    Tag = True
                elif line.lstrip().startswith("0.000 ") and line.rstrip().endswith("default"):
                    Tag = False
                    break
                elif Tag:
                    output.write(line)

我做错什么了?你知道吗

编辑:添加更多我的代码,希望对问题有所帮助。此代码用于从其他文件复制一些外部数据以更新我的当前文件。
谢谢布鲁诺,我明白你的意思了。dummyRig函数给我一个字符串,但不是一个“真正的”文件。getBlock函数需要一个“实”文件输入。对吗?
还是希望有人给我更多有用的帮助,我不是程序员,我对python了解不多。你知道吗


Tags: 函数infalseforiftaglineopen
1条回答
网友
1楼 · 发布于 2024-09-28 03:15:24

在您的“测试”中,您正在对打开的文件进行迭代。文件迭代器遍历文件的行。你知道吗

在您的脚本中,传递给getBlock的是一个字符串,因此您对该字符串的各个字符进行迭代。难怪你没有得到同样的结果。你知道吗

如果您想getBlock既能处理打开的文件,也能处理任意的字符串,那么必须将字符串包装在类似文件的对象中,该对象将遍历行,而不是字符。想到stdlib的^{}模块。。。你知道吗

另外,如果您真的想认真对待测试,请使用一些自动化的unittest框架(unittest可能不是最吸引人的,但它在stdlib中),并确保您真正测试的是您将传递给函数的相同内容;)

相关问题 更多 >

    热门问题