Как удалить функцию питон

Как удалить функции на Python?

У меня один игровой сервер. У меня есть один инструмент, и я использовал его для генерации crc32 + timestamp и сохранения в файл .. но этот файл скрипта имеет больше функций, и я не хочу их использовать. Мне нужно просто получить crc32, timestamp и сохранить в файл.

Я пытаюсь удалить эти функции, но не работаю, выдает синтаксис или другую ошибку. Я пробовал 100х .. И я хочу написать здесь, может кто-нибудь мне поможет ..

#!/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Как удалить функцию питон 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('') for f in files: file.write('\t\n' % (f, f)) file.write('') 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 в той же папке

Читайте также:  Import egg file python

Источник

Удалить функцию

Я пытаюсь создать функцию для удаления другой функции.

 def delete_function(func): del func 

Это то, что у меня есть, но по какой-то причине это не работает.

def foo(): print("foo") delete_function(foo) 

Кажется, не делает трюк. Я знаю, что это можно сделать легко, просто

Но я пытаюсь сделать это по-другому. Как?

3 ответа

Удаление функции — это не то, что вы делаете для самой функции; это то, что вы делаете с пространством имен, в котором оно живет. (Подобно тому, как удаление номера 3 из списка — это не то, что вы делаете с номером 3, это то, что вы делаете со списком.)

def foo(x): return 1 bar = foo 

Тогда (более или менее) у вас есть два имени, foo и bar , для одной и той же функции. Теперь предположим, что вы звоните delete_function(foo) или delete_function(bar) . То же самое , а именно объект функции, передается в delete_function . Но что вы на самом деле хотите удалить, так это связь между именем foo или bar и этим объектом — и нет никакого способа, которым delete_function (как бы вы его ни определили) могли узнать, является ли он < > или bar или что-то еще, от чего вы хотите избавиться.

(Ну . На самом деле, есть. Есть некоторые неприятные вещи, которые вы можете сделать, которые позволят коду в delete_function узнать больше о том, как он был назван. Но даже не думайте о них думать.)

Так. Ваши варианты следующие. (1) Гадкие хакерские вещи, как только что упомянуто. Не . (2) Передайте delete_function не объект функции, а информацию о названии функции и объекте, из которого вы пытаетесь ее удалить. Это безобразно и неуклюже. (3) Не беспокойся.

Я настоятельно рекомендую # 3, если единственная причина, по которой вы это делаете, — это узнать больше о том, как работает Python. В последнем случае хорошим началом может стать http://docs.python.org/reference /executionmodel.html.

То, что вы пытаетесь сделать, это, по сути, пространство имен вызывающей стороны.

print "0", locals() def foo(): pass print "1", locals() del foo print "2", locals() 
  1. местные значения dict в 0 и 2 идентичны, а в 1 почти — за исключением того, что у него есть дополнительное назначение foo .
  2. del это оператор, а не функция

Если вы выполняете del в функции delete_function() , по существу, назначение внутри вашей функции удаляется (что безрезультатно, потому что функция немедленно завершается), пока вызывающая сторона сохраняет назначение.

Строго говоря, del не удаляет объекты, а просто присваивает имена объектам. Объекты удаляются «автоматически» (сборщик мусора), как только на них больше не ссылаются.

Это МОЖЕТ работать, что вы пытаетесь сделать, проверяя кадр стека и передавая имя, которое будет удалено как строку, но это будет PITA.

? Но я думаю, что не гарантируется, что он действительно изменяет настоящий словарь местных жителей, он может также работать с копией и, таким образом, оставаться безрезультатным .

Поскольку foo является глобальным, вы можете удалить его из глобальных определений:

def delete_func(func): del globals()[func.func_name] 

Источник

Оцените статью