Beim Definieren eines Scheinwerfers in Pytest unterstützt der Dekorateur "Scheinwerfer" entweder ohne Klammern und Argumente oder mit Klammern und Argumenten wie "(scope =" session ")". Der folgende Code ist ein Beispiel für beide Verwendungen in der Pytest-Dokumentation.
Quelle: Pytest-Dokumentation
python
@pytest.fixture
def smtp():
return smtplib.SMTP("smtp.gmail.com")
python
@pytest.fixture(scope="module")
def smtp():
return smtplib.SMTP("smtp.gmail.com")
Ich habe versucht herauszufinden, wie man einen solchen Dekorateur beschreibt.
Um genau zu sein, wird in der ersteren Verwendung mit Klammern und ohne Argumente "Fixture" als Dekorator bezeichnet, und in der zweiten Verwendung mit Klammern und Argumenten wird "Fixture" als Dekorator ("Decomaker") bezeichnet. .. ([PEP 318 --Dekoratoren für Funktionen und Methoden] (https://www.python.org/dev/peps/pep-0318/#current-syntax))
In Pytests Fixture Source wurde das Fixture wie folgt implementiert:
python
def fixture(scope="function", params=None, autouse=False, ids=None, name=None):
""" (return a) decorator to mark a fixture factory function.
This decorator ....(Abkürzung)
"""
if callable(scope) and params is None and autouse == False:
# direct decoration
return FixtureFunctionMarker(
"function", params, autouse, name=name)(scope)
if params is not None and not isinstance(params, (list, tuple)):
params = list(params)
return FixtureFunctionMarker(scope, params, autouse, ids=ids, name=name)
Wenn fixture
als Dekorator mit Klammern und ohne Argumente verwendet wird, wird das in der Funktionsdefinition nach dem Dekorator definierte Funktionsobjekt ( smtp
im obigen Beispiel) an das Argument scope
von fixture
übergeben. Ich werde.
Überprüft, ob if callable (in der Zeile ...
ist scope`` callable
(und gleichzeitig sind die folgenden Argumente Standardwerte), und wenn ja, decomaker FixtureFunctionMaker
Erstellt eine Instanz von und übergibt scope
an its ()
.
Wenn das Fixture hingegen mit Klammern und Argumenten verwendet wird, wird der Decorator (Decomaker-Instanz) selbst zurückgegeben. Python übergibt "smtp" an den zurückgegebenen Dekorateur und weist den Rückgabewert dem Namen "smtp" zu.
Es ist unangenehm, das ursprüngliche Argument "scope" für einen völlig anderen Zweck zu verwenden, aber es kann zu einer Funktion zusammengefasst werden, wodurch eine Dekorationsoberfläche entsteht, die für Benutzer einfach zu verwenden ist.
Recommended Posts