簡體   English   中英

python中的上下文管理器和輔助函數

[英]context manager and helper function in python

我有一些使用上下文管理器的函數:

def f1():
    with open("test.txt","r+") as f:
        f.write("common Line")
        f.write("f1 Line")

def f2():
    with open("test.txt","r+") as f:
        f.write("common Line")
        f.write("f2 Line")

def f3():
    with open("test.txt","r+") as f:
        f.write("common Line")
        f.write("f3 Line")

這些函數有一些共同的行。 所以我想添加一個輔助函數。 像這樣的東西

def helperF():
    with open("test.txt","r+") as f:
        f.write("common Line")

然后以某種方式從我的 f1,f2,f3 函數中調用它以使代碼干燥。

但我不太確定在這種情況下如何處理上下文管理器。 以下將不起作用,因為在調用函數時 f 已經關閉:

def f1():
    commonHelper()
    f.write("f1 Line")

def f2():
    commonHelper()
    f.write("f2 Line")

def f3():
    commonHelper()
    f.write("f3 Line")

如果這三個函數每個都向文件寫入相當多的內容,我會建議重構,以便它們返回要寫入的字符串列表,而不是讓多個函數直接寫入文件。

def write_with_common_header(lines):
    with open("test.txt", "r+") as f:
        f.write("common Line")
        for line in lines:
            f.write(line)

def f1():
    return ["f1 Line"]

def f2():
    return ["f2 Line"]

def f3():
    return ["f3 Line"]

# usage example:
write_with_common_header(f2())

如果每個函數返回的列表總是相同的,那么它們甚至不需要是函數; 您可以將它們聲明為列表。


在上下文管理器不一定是文件的更一般情況下,單獨的函數不僅僅是調用單個方法,那么我們不能將它們作為數據傳遞,但可以應用相同的技術:使write_with_common_header函數接受一個參數,以便其行為可以參數化。 為了完全通用,參數應該是一個函數,它接受對托管資源f的引用。

def common_helper(callback):
    with open("test.txt", "r+") as f:
        f.write("common Line")
        callback(f)

def f1(f):
    f.write("f1 Line")

def f2(f):
    f.write("f2 Line")

def f3(f):
    f.write("f3 Line")

# usage example: 
common_helper(f2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM