Подтвердить что ты не робот

Передать аргумент __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__. Возможно ли это?

4b9b3361

Ответ 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__