如何在python上删除函数?

时间:2014-03-27 00:33:30

标签: python function timestamp crc32

我有一个游戏服务器。我有一个工具,我用它来生成crc32 +时间戳并保存到文件..但这个脚本文件有更多的功能,我不想使用它们。我只需要获取crc32,时间戳并保存到文件。

我尝试删除这些函数,但不能正常工作,它会产生语法或其他错误。我试过100x ..我想在这里发帖,也许有人可以帮助我..

#!/usr/local/bin/python

from urllib import urlopen
from datetime import date
import sys
import os
import zlib
import getopt
import csv
import zipfile

#
# Utility functions
#

def FindFilesByExt(path, ext):
    ext = ext.lower()

    for root, dirs, files in os.walk(path):
        for name in files:
            if name[-len(ext):].lower() == ext:
                yield os.path.join(root, name)

def GetFileCrc32(filename):
    crc = 0
    for line in open(filename, "rb"):
        crc = zlib.crc32(line, crc)

    return "%x" % (crc & 0xffffffff)

def FormatName(filename):
    if filename[:2] == ".\\":
        filename = filename[2:]

    return filename.replace("\\", "/")

def GetLastModifiedTime(filename):
    # http://support.microsoft.com/kb/167296
    # How To Convert a UNIX time_t to a Win32 FILETIME or SYSTEMTIME
    EPOCH_AS_FILETIME = 116444736000000000  # January 1, 1970 as MS file time
    HUNDREDS_OF_NANOSECONDS = 10000000

    return EPOCH_AS_FILETIME + long(os.path.getmtime(filename)) * HUNDREDS_OF_NANOSECONDS

#
# Real code
#

class Patch:
    def __init__(self):
        self.name = None
        self.patch_url = None

        # Patch file list
        self.file_dict = dict()
        self.file_list = None

    def SetName(self, name):
        self.name = name

    def SetPatchUrl(self, url):
        self.patch_url = url

    def AddFilesFromPatchUrl(self):
        for line in urlopen(self.patch_url):
            line = line.split()
            print line
            line[4] = FormatName(line[4])
            self.file_dict[line[4].lower()] = line

    def AddFile(self, filename):
        filename = FormatName(filename)
        mtime = GetLastModifiedTime(filename)

        #
        # Format is as following:
        # unpacked_crc unpacked_size low_last_edit high_last_edit path
        #

        self.file_dict[filename.lower()] = [GetFileCrc32(filename),
                            "%d" % (os.path.getsize(filename)),
                            "%d" % (mtime >> 32),
                            "%d" % (mtime & 0xffffffff), filename]

        # Sorted list no longer contains all files. Invalidate it.
        self.file_list = None

    def GetCrcList(self):
        self.__SortFileList()

        output = ""
        for entry in self.file_list:
            output += (" ".join(entry) + "\n")

        return output

    def __SortFileList(self):
        if not self.file_list:
            self.file_list = [self.file_dict[key] for key in self.file_dict]
            self.file_list.sort(key=lambda entry: entry[4].lower()) # 4 = filename index


kPatchConfigFieldNames = ["Name", "Url"]

def GetPatchInstance(filename, desiredName):
    with open(filename, 'r') as file:
        reader = csv.DictReader(file, fieldnames=kPatchConfigFieldNames, dialect='excel-tab')
        reader.next()

        for row in reader:
            if row["Name"] == desiredName:
                patch = Patch()
                patch.SetName(row["Name"])
                patch.SetPatchUrl(row["Url"])
                return patch

    raise RuntimeError("Failed to find %s!" % (desiredName))
    return None

def WriteXmlFile(filename, files):
    file = open(filename, "wb+")

    file.write('<ScriptFile>')

    for f in files:
        file.write('\t<CreateLz Input="%s" Output="%s.lz" />\n' % (f, f))

    file.write('</ScriptFile>')

def main(argv):
    #
    # Parse command-line arguments
    #

    optlist, args = getopt.getopt(argv[1:], 'a:f:p:', ['archive=', 'file=', 'patchcfg='])

    archives = list()
    files = list()
    patchConfigName = None

    for name, value in optlist:
        if name == "--archive" or name == "-a":
            files.append("pack/" + value + ".eix")
            files.append("pack/" + value + ".epk")
        elif name == "--file" or name == "-f":
            files.append(value)
        elif name == "--patchcfg" or name == "-p":
            patchConfigName = value

    #
    # Decide over patch-config to use...
    #

    patch = GetPatchInstance("PatchConfig.txt", patchConfigName)

    # Add already existing files
    patch.AddFilesFromPatchUrl()

    # Process files
    WriteXmlFile("make_patch.xml", files)

    os.system("FileArchiver make_patch.xml")

    os.unlink("make_patch.xml")

    # Create patch ZIP
    zip = zipfile.ZipFile("PATCH_%s_%s.zip" % (patchConfigName, date.today().strftime("%m%d%Y")), "w", zipfile.ZIP_DEFLATED)

    for file in files:
        patch.AddFile(file)
        file = file + ".lz"
        zip.write(file)
        os.unlink(file)

    zip.writestr("crclist", patch.GetCrcList())

    zip.close()

main(sys.argv)

如果您想试用此脚本,请在cmd:

中运行此脚本
python make_patch.py -f filename.extension -p patch_live

要运行此功能,它需要PatchConfig.txt在同一个文件夹

make_patch.py

PatchConfig.txt

1 个答案:

答案 0 :(得分:0)

当你从脚本中删除函数时,你需要确保你删除的函数是而不是稍后在代码中调用。

例如,让我们说你的脚本如下:

def foo(x):
    return x*x

def banana():
    return "Peel"

def bar():
    return "My " + banana()

i = int(raw_input("Please enter a number to be squared: "))

print foo(i) #prints the number you entered, squared

print banana() #prints "Peel"

print bar() #prints "My Peel"

因此,如果我只想要函数bar()foo(x)的功能而且我不需要使用函数banana(),我可以删除这些函数。但是,如果我删除函数banana(),则会出现错误,如下所示:

def foo(x):
    return x*x

#deleted banana()

def bar():
    return "My " + banana()

i = int(raw_input("Please enter a number to be squared: "))

print foo(i) #prints the number you entered, squared

print banana() #gives an error because banana() is not defined

print bar() #not executed because of the above error.

让我们删除print banana()并查看是否可以修复它。

def foo(x):
    return x*x

#deleted banana()

def bar():
    return "My " + banana()

i = int(raw_input("Please enter a number to be squared: "))

print foo(i) #prints the number you entered, squared

#deleted print banana()

print bar() #error because the bar() function calls the deleted banana() function

这仍然不起作用,因为bar()函数在此处调用banana()

def bar():
    return "My " + banana()

删除某个功能时,无论身在何处,都需要删除对该功能的每次调用。如果没有,Python将尝试调用一个不存在的函数,并会给你一个错误。删除banana()所有痕迹的正确示例代码如下:

def foo(x):
    return x*x

#deleted banana()

def bar():
    return "My " + "Peel" # removed banana()

i = int(raw_input("Please enter a number to be squared: "))

print foo(i) #prints the number you entered, squared

#deleted print banana()

print bar() #prints "My Peel"

将此代码应用于代码时,请确保您要删除的任何函数(crc32函数)都不会直接调用您删除的函数。在我的示例中,如果您想保留bar()函数,则banana()函数实际上是运行bar()所必需的,因此您不应删除它。

在您的代码中,AddFile方法是您拨打GetFileCrc32()时所呼叫的方法。如您所见,FormatName()GetLastModifiedTime()也被调用。这些功能是GetFileCrc32()工作所必需的,因此您不能删除它们。

 def AddFile(self, filename):
    filename = FormatName(filename)
    mtime = GetLastModifiedTime(filename)

    #
    # Format is as following:
    # unpacked_crc unpacked_size low_last_edit high_last_edit path
    #

    self.file_dict[filename.lower()] = [GetFileCrc32(filename),
                        "%d" % (os.path.getsize(filename)),
                        "%d" % (mtime >> 32),
                        "%d" % (mtime & 0xffffffff), filename]

    # Sorted list no longer contains all files. Invalidate it.
    self.file_list = None

我希望这有帮助!