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écomaker
FixtureFunctionMakerCrée une instance de et transmet
scope à 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