Передать аргумент __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__
. Возможно ли это?
Ответы
Ответ 1
Нет. Вы не можете. Вы передаете аргументы __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"
Ответ 2
Да, вы можете получить эффект, добавив немного больше кода.
#!/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
Ответ 3
Не могли бы вы просто передать значения __init__
через конструктор класса?
Ответ 4
Вы можете использовать декоратор contextmanager для передачи аргументов:
https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager
from contextlib import contextmanager
@contextmanager
def clippy_runner(*args):
yield
IMHO, я сбиваю с толку, что с помощью contextmanager
вы можете предоставить аргументы, но вы не можете предоставить их __enter__