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