Украсить функцию чтения, которая изменяет способ открытия файла - PullRequest
0 голосов
/ 26 марта 2020

У меня есть следующая функция

def read_tower(path_to_file):

    with open(path_to_file,'r') as f:

        for text in f:

            text_line = text.strip().split(" ")

Моя идея состоит в том, чтобы использовать декоратор для изменения этой функции, чтобы я мог читать файлы из zip-папки, например

with zipfile.ZipFile(Path(zip_filename)) as z:
    for filename in z.namelist():
        if re.search(r'.*\.mlm',filename):
            #with z.open(filename,mode="r") as f:
            data = read_tower(f)

Так что в основном я хочу украсить read_tower , чтобы я мог использовать z.open вместо open .

Я еще новичок в декораторах. Спасибо.

1 Ответ

1 голос
/ 26 марта 2020

Чтобы сделать это с помощью декоратора, вы можете ввести ContextManager любого типа файла в логи чтения, записи (или любой другой необходимой вам обработки) c, что-то вроде этого:

def reader(func):
    def wrap(*args, **kwargs):
        with func(*args, **kwargs) as f:
            for text in f:
                text_line = text.strip().split(" ")
            ...      
    return wrap

@reader
def file_reader(*args, **kwargs):
    return open(*args, **kwargs)

@reader
def zipfile_reader(z, *args, **kwargs):
   return z.open(*args, **kwargs)

file_content = file_reader(<path>, <mode>)
zipfile_content = zipfile_reader(zipfile_obj, <filename>, <extra_args>)

Но Я рекомендую просто извлечь общий лог c из read_tower в отдельную функцию:

def read_file_content(file):
    for text in f:
        text_line = text.strip().split(" ")
    ...

использование файла:

with open('..path', mode) as f:
    read_file_content(f)

использование zipfile:

with zipfile.ZipFile(Path(zip_filename)) as z:
    for filename in z.namelist():
        if re.search(r'.*\.mlm',filename):
            with z.open(filename,mode="r") as f:
                read_file_content(f)

Примечание : код здесь только для того, чтобы дать представление, это не полностью рабочий код.

...