2011-02-24 14 views
27

只是學習與報表especially from this article通參數__enter__

的問題是,我可以傳遞參數__enter__

我有這樣的代碼:

class clippy_runner: 
    def __enter__(self): 
     self.engine = ExcelConnection(filename = "clippytest\Test.xlsx") 
     self.db = SQLConnection(param_dict = DATASOURCES[STAGE_RELATIONAL]) 

     self.engine.connect() 
     self.db.connect() 

     return self 

我想通過文件名和param_dict作爲參數傳遞給__enter__。那可能嗎?

回答

34

不可以。您將參數傳遞給__init__()

class ClippyRunner(object): 
    def __init__(self, args): 
     self._args = args 

    def __enter__(self): 
     # Do something with args 
     print(self._args) 


with ClippyRunner(args) as something: 
    # work with "something" 
+0

是的!謝謝。一旦時限已過(5分鐘),我會將其標記爲已接受。 – Ramy 2011-02-24 19:44:27

+7

我很困惑。因爲你只是在'__init__'中傳遞''傳遞'__enter__'函數是否提供'__init__'傳遞給'__init__'? – Hovis 2013-08-29 19:31:02

+1

Hovis:傳遞給init的參數可以保存,然後在輸入方法中使用。 'DEF __init __(個體,文件名,param_dict):self.filename =文件名self.param_dict = param_dict''DEF __enter __(個體):self.filename ...' – spazm 2014-11-21 17:51:05

3

難道你不只是通過類的構造函數值傳遞給__init__

10

是的,您可以通過添加更多的代碼來獲得效果。


    #!/usr/bin/env python 

    class Clippy_Runner(dict): 
     def __init__(self): 
      pass 
     def __call__(self, **kwargs): 
      self.update(kwargs) 
      return self 
     def __enter__(self): 
      return self 
     def __exit__(self, exc_type, exc_val, exc_tb): 
      self.clear() 

    clippy_runner = Clippy_Runner() 

    print clippy_runner.get('verbose')  # Outputs None 
    with clippy_runner(verbose=True): 
     print clippy_runner.get('verbose') # Outputs True 
    print clippy_runner.get('verbose')  # Outputs None 
1

可以使用contextmanager裝飾來傳遞參數:

https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager

from contextlib import contextmanager 

@contextmanager 
def clippy_runner(*args): 
    yield 

恕我直言,我感到迷惑,使用contextmanager你可以提供的參數,但你不能把它們提供給__enter__

+0

我第二此。我有一些僅在上下文中相關的設置。傳遞給'__init__'是愚蠢的。 – Muposat 2017-05-08 14:35:54