[PYTHON] Comment définir Decorator et Decomaker avec une seule fonction

Lors de la définition d'un appareil dans Pytest, le décorateur fixture prend en charge soit sans parenthèses ni arguments, soit avec des parenthèses et des arguments tels que (scope =" session "). Le code suivant est un exemple des deux utilisations dans la documentation Pytest.

Source: documentation Pytest

python


@pytest.fixture
def smtp():
    return smtplib.SMTP("smtp.gmail.com")

python


@pytest.fixture(scope="module")
def smtp():
    return smtplib.SMTP("smtp.gmail.com")

J'ai essayé de trouver comment décrire un tel décorateur.

Pour être précis, dans le premier usage avec des parenthèses et sans arguments, fixture est appelé un décorateur, et dans le dernier usage avec des parenthèses et des arguments, fixture est un décorateur (decomaker). .. ([PEP 318 - Décorateurs de fonctions et de méthodes] (https://www.python.org/dev/peps/pep-0318/#current-syntax))

Dans la [source du luminaire] de Pytest (https://github.com/pytest-dev/pytest/blob/75ec893d758ba9c376e849eb8fd6aadc38ed38eb/_pytest/fixtures.py#L841), le montage a été implémenté comme suit:

python


def fixture(scope="function", params=None, autouse=False, ids=None, name=None):
    """ (return a) decorator to mark a fixture factory function.

    This decorator ....(Abréviation)    
    """
    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)

Si fixture est utilisé comme décorateur avec des parenthèses et aucun argument, l'objet de fonction ( smtp dans l'exemple ci-dessus) défini dans la définition de fonction après le décorateur est passé à l'argument scope de fixture. Je vais.

ʻSi callable (sur la ligne de ... , vérifiez si scope est callable(en même temps, si l'argument qui suit est la valeur par défaut), et si c'est le cas, décomakerFixtureFunctionMakerCrée une instance de et transmetscope à its ()`.

D'un autre côté, si fixture est utilisé avec des parenthèses et des arguments, il retourne le décorateur (instance de décomaker) lui-même. Python transmet «smtp» au décorateur retourné et affecte la valeur de retour au nom «smtp».

Il est désagréable d'utiliser l'argument initial scope dans un but complètement différent, mais il peut être agrégé en une seule fonction, créant une interface de décorateur facile à utiliser pour les utilisateurs.

Recommended Posts

Comment définir Decorator et Decomaker avec une seule fonction
Comment utiliser Decorator dans Django et comment le créer
Comment convertir 0,5 en 1056964608 en un seul coup
Comment définir dynamiquement des variables en Python
Comment utiliser is et == en Python
Comment générer une séquence en Python et C ++
Comment définir votre propre cible dans Sage
[Python] Comment utiliser la fonction de hachage et taple.
Comment se moquer d'une fonction publique dans Pytest
Comment tracer l'autocorrélation et l'autocorrélation partielle avec Python
[Route vers Python intermédiaire] Définir la fonction __getattr__ dans la classe
Comment faire du zéro-padding sur une ligne avec OpenCV
[Python] Comment trier un dict dans une liste et une instance dans une liste
Comment obtenir des histogrammes RVB et HSV avec OpenCV
Comment stocker une fonction Python dans la valeur d'un dictionnaire (dict) et appeler la fonction en fonction de la clé
Covector pour penser en fonction
Comment appeler une fonction
Comment définir les variables Go
Comment développer en Python
Comment utiliser le décorateur
Comment échanger des éléments dans un tableau en Python et comment inverser un tableau.
Les étrangers parlent: Comment nommer les classes et les méthodes en anglais
Comment vérifier le comportement d'ORM avec un fichier avec django
[Python] Comment jouer avec les variables de classe avec décorateur et métaclasse
Comment utiliser pyenv et pyenv-virtualenv à votre manière
[Python] Comment écrire une instruction if en une phrase.
[Introduction à l'application Udemy Python3 +] 36. Utilisation de In et Not
Comment définir plusieurs variables dans une instruction Python for
Comment créer et utiliser des bibliothèques statiques / dynamiques en langage C
Comment échantillonner à partir de n'importe quelle fonction de densité de probabilité en Python
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Comment obtenir toutes les clés et valeurs du dictionnaire
[Blender] Comment gérer les événements de souris et de clavier dans les scripts Blender
[TF] Comment charger / enregistrer le modèle et le paramètre dans Keras
Comment exécuter des commandes et des scripts shell externes en python
Comment créer une trame de données et jouer avec des éléments avec des pandas
[ROS] Comment écrire un éditeur et un abonné sur un nœud
Comment se connecter à AtCoder avec Python et soumettre automatiquement
Comment faire "Prêter et emprunter des méthodes JS (celle qui utilise s'appliquent)" en Python
Comment mettre à jour automatiquement la description de l'App Store dans Google Spreadsheets et Fastlane
Comment gérer une session dans SQLAlchemy
Comment utiliser la fonction zip
Comment installer OpenCV sur Cloud9 et l'exécuter en Python
Comment comparer des listes et récupérer des éléments communs dans une liste
Comment installer et utiliser Tesseract-OCR
Comment utiliser les classes dans Theano
Comment écrire sobrement avec des pandas
Comment collecter des images en Python
Repeated @ app.callback dans Dash Comment écrire correctement l'entrée et l'état
Comment donner et signifier l'option des contraintes dans scipy.optimize.minimize
[Python 3.8 ~] Comment définir intelligemment des fonctions récursives avec des expressions lambda
Comment mettre à jour Spyder dans Anaconda
Comment utiliser SQLite en Python
Comment utiliser les fonctions dans des fichiers séparés version Perl et version Python
Comment définir intelligemment les objets couramment utilisés dans View
Comment créer une fonction récursive
Comment combiner tous les CSV d'un dossier en un seul CSV
Comment refléter CSS dans Django