簡體   English   中英

如何使用上下文管理器來定義用於實例化新類的實際上下文?

[英]How can I use a context manager to define an actual context for instantiation of new classes?

我有以下問題。 我有多個單元測試,每個單元測試都有一個上下文管理器來打開瀏覽器並進行一些硒測試。

我想確保我可以並行運行測試,並且在出現錯誤時關閉瀏覽器窗口,所以我使用了上下文管理器:

def test_xxx():
    with webapp() as p:                                                                   
        file_loader = FileLoader(p, id="loader").upload(path)

如您所見,我使用了一個類 FileLoader,它采用上下文管理器 Web 應用程序(基本上是 selenium 驅動程序的包裝器)並使用它來封裝上傳文件所需的繁瑣程序。

我的目標是不必為 FileLoader() 指定 p 參數,以便我可以編寫

def test_xxx():
    with webapp():                                                                   
        file_loader = FileLoader(id="loader").upload(path)

我可以使用在上下文管理器打開時分配的全局變量,但這會在測試並行運行時防止任何隔離。 假設一個測試連接到站點 A,另一個測試連接到站點 B。我需要兩個驅動程序,每個驅動程序連接到不同的站點。

換句話說,如何在不傳遞上下文變量的情況下設計 FileLoader 以了解其封閉的上下文管理器?

通過使用inspect模塊,代碼可以讀取其調用者的局部變量。 這是一個相當不尋常的使用,如果不是危險的,因為它實際上歸結為將參數傳遞給函數的非標准和非傳統方式。 但是,如果您真的想那樣做,那么另一個SO 問題提供了一種可能的方法。

演示:

class ContextAware:
    """ Class that will copy  the x local variable of its caller if any"""
    def __init__(self):
        # uncomment next line for debugging
        # print("ContextAware", inspect.currentframe().f_back.f_locals)
        self.x = inspect.currentframe().f_back.f_locals.get('x')

        
def foo(x):
    # the value of x is not explicitely passed, yet it will be used...
    return ContextAware()

在 foo 中創建的對象知道其調用者的x變量:

>>> a = foo(4)
>>> a.x
4
>>> a = foo(6)
>>> a.x
6

這意味着你可以寫一些接近於:

def test_xxx():
    with webapp() as ctx_p:
        file_loader = FileLoader(id="loader").upload(path)

提供的__init__的方法FileLoader間諜ctx_p它的調用者的局部變量。

暫無
暫無

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

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