2011-02-24 17 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 

मैं __enter__ को पैरामीटर के रूप में फ़ाइल नाम और param_dict पारित करने के लिए करना चाहते हैं। क्या यह संभव है?

उत्तर

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

+7

मैं उलझन में हूँ। क्योंकि आप '__init__' में बस 'पास' कर रहे हैं, क्या आप सुझाव दे रहे हैं कि '__init__'' को पारित 'तर्क'' __enter__' फ़ंक्शन में उपलब्ध हैं? – Hovis

+1

होविस: init को पास किए गए तर्क सहेजे जा सकते हैं और फिर एंटर विधि में उपयोग किए जा सकते हैं। 'def __init __ (स्वयं, फ़ाइल नाम, param_dict): self.filename = filename self.param_dict = param_dict'' def __enter __ (स्वयं): self.filename ... ' – spazm

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 

IMHO, मैं भ्रमित कि contextmanager का उपयोग कर आप तर्क प्रदान कर सकते हैं लगता है, लेकिन आप __enter__

करने के लिए उन्हें प्रदान नहीं कर सकते
+0

मैं इसे दूसरा करता हूं। मेरे पास कुछ सेटिंग्स हैं जो केवल संदर्भ के अंदर प्रासंगिक हैं। उन्हें '__init__' में पास करना मूर्खतापूर्ण है। – Muposat

संबंधित मुद्दे