[PYTHON] So definieren Sie Decorator und Decomaker mit einer Funktion

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

So definieren Sie Decorator und Decomaker mit einer Funktion
Wie man Decorator in Django benutzt und wie man es macht
So konvertieren Sie 0,5 in 1056964608 auf einmal
Dynamisches Definieren von Variablen in Python
Verwendung ist und == in Python
So generieren Sie eine Sequenz in Python und C ++
So definieren Sie Ihr eigenes Ziel in Sage
[Python] Verwendung von Hash-Funktion und Taple.
Wie man eine öffentliche Funktion in Pytest verspottet
Wie man Autokorrelation und partielle Autokorrelation mit Python zeichnet
[Road to Intermediate Python] Definieren Sie die Funktion __getattr__ in der Klasse
So führen Sie mit OpenCV ein Null-Padding in einer Zeile durch
[Python] So sortieren Sie Diktate in Listen und Instanzen in Listen
So erhalten Sie RGB- und HSV-Histogramme mit OpenCV
So speichern Sie eine Python-Funktion im Wert eines Wörterbuchs (dict) und rufen die Funktion gemäß dem Schlüssel auf
Covector, um in Funktion zu denken
So rufen Sie eine Funktion auf
So definieren Sie Go-Variablen
Wie man in Python entwickelt
Wie benutzt man den Dekorateur?
So tauschen Sie Elemente in einem Array in Python aus und wie kehren Sie ein Array um.
Ausländer sprechen: Wie man Klassen und Methoden auf Englisch benennt
So überprüfen Sie das Verhalten von ORM mit einer Datei mit django
[Python] Wie man mit Klassenvariablen mit Dekorator und Metaklasse spielt
Wie Sie pyenv und pyenv-virtualenv auf Ihre eigene Weise verwenden
[Python] Wie schreibe ich eine if-Anweisung in einen Satz?
[Einführung in die Udemy Python3 + -Anwendung] 36. Verwendung von In und Not
So definieren Sie mehrere Variablen in einer Python for-Anweisung
Erstellen und Verwenden von statischen / dynamischen Bibliotheken in C-Sprache
Wie man aus einer Wahrscheinlichkeitsdichtefunktion in Python tastet
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
So erhalten Sie alle Schlüssel und Werte im Wörterbuch
[Blender] Umgang mit Maus- und Tastaturereignissen in Blender-Skripten
[TF] Laden / Speichern von Modell und Parameter in Keras
Ausführen externer Shell-Skripte und -Befehle in Python
So erstellen Sie einen Datenrahmen und spielen mit Elementen mit Pandas
[ROS] So schreiben Sie Publisher und Subscriber auf einen Knoten
So melden Sie sich mit Python bei AtCoder an und senden automatisch
Vorgehensweise zum Ausleihen und Ausleihen von JS-Methoden (die verwendete Methode) in Python
So aktualisieren Sie die App Store-Beschreibung in Google Spreadsheets und Fastlane automatisch
Umgang mit Sitzungen in SQLAlchemy
Verwendung der Zip-Funktion
So installieren Sie OpenCV in Cloud9 und führen es in Python aus
So vergleichen Sie Listen und rufen allgemeine Elemente in einer Liste ab
So installieren und verwenden Sie Tesseract-OCR
Verwendung von Klassen in Theano
Wie man nüchtern mit Pandas schreibt
So sammeln Sie Bilder in Python
Repeated @ app.callback in Dash So schreiben Sie Input und State ordentlich
Geben und meinen Sie die Einschränkungsoption in scipy.optimize.minimize
[Python 3.8 ~] Wie man rekursive Funktionen mit Lambda-Ausdrücken intelligent definiert
So aktualisieren Sie Spyder in Anaconda
Verwendung von SQLite in Python
Verwendung von Funktionen in separaten Dateien Perl-Version und Python-Version
So definieren Sie Objekte, die häufig in View verwendet werden, intelligent
So erstellen Sie eine rekursive Funktion
So kombinieren Sie alle CSVs in einem Ordner zu einer CSV
Wie man CSS in Django reflektiert