0
votes

Comment puis-je écrire un décorateur qui change avec des arguments

Je dois écrire un décorateur def qui prend un validator def comme argument. Si le validateur renvoyé true il doit décorer principal pour exécuter du code et s'il est renvoyé false il devrait imprimer un erreur Juger (la validation doit être effectuée en dehors du décorateur)

Voici un exemple: xxx


2 commentaires

"J'ai essayé d'écrire deux def dans la décoratrice avec une déclaration IF pour renvoyer deux défensements différents, mais cela ne fonctionne pas" - Veuillez inclure votre tentative dans le poste.


La fonctionnalité et la logique doivent ressembler exactement comme je l'ai dit (en raison d'un jugement en ligne)


4 Réponses :


0
votes

Les décorateurs peuvent être écrits comme exemple

def limit_decorator(func): 
    def internal(arg): 

        if (arg >= 0):
            return func(arg) 

        else:
            raise Exception("false input")

    return internal 


@limit_decorator
def square_root(a): 
    return a * 0.5

a = -5

print("Sum =", square_root(a)) 


1 commentaires

Le problème est que le code que j'ai envoyé va être juge en ligne afin que je ne puisse pas réécrire le code. Le décorateur doit être defiine exactement comme je l'ai dit



0
votes

Je suggérerais de faire la validation de X, en utilisant une couche sur des fonctions imbriquées (fondamentalement fusionner la fonction de validateur dans le décorateur) xxx


1 commentaires

Merci de votre réponse, mais la fonctionnalité du code doit être comme si j'ai dit, car il va être jugé en ligne



0
votes

Essayez ceci:

def decorator(validator):
    def subdecorator(function):
        def actual_function(arg):
            if not validator(arg):
                raise ValueError(f"Bad data: {arg}")
            return function(arg)
        return actual_function
    return subdecorator


0 commentaires

0
votes

Voici ce que vous pouvez faire

#define decorator...

def validator(x):
    return x>=0

def deco(validator):
    def decorator(func):
        def wrapper_decorator(*args, **kwargs):
            if validator(*args, **kwargs):
                return func(*args, **kwargs)
            else:
                print("error")
                return 
        return wrapper_decorator
    return decorator


@deco(validator)
def f(x):
    return x**0.5

print(f(4)) #should print 2
print(f(-4)) #should print error


0 commentaires