J'ai remarqué dans ma fonction que j'avais plusieurs lignes de code similaires au début et au bas de mes fonctions, par exemple:

    def foo1():
        print('start')
        print('of ')
        print('a code')

        '''
        a lot of other code for the foo1
        '''

        print('end')
        print('of')
        print('the code')

    def foo2():
        print('start')
        print('of ')
        print('a code')

        '''
        a lot of other code for the foo2
        '''

        print('end')
        print('of')
        print('the code')

Je pourrais mettre les pièces similaires dans différentes méthodes comme indiqué ci-dessous:

def foo_init():
    print('start')
    print('of ')
    print('a code')

def foo_end():
    print('end')
    print('of')
    print('the code')


def foo1():
    foo_init()
    '''
    a lot of other code for the foo1
    '''
    foo_end():

def foo2():
    foo_init()
    '''
    a lot of the other for the foo1
    '''
    foo_end():

Je me demande donc, s'il existe des moyens meilleurs / plus intelligents de le faire, peut-être en utilisant l'héritage de classe ou pour la boucle?

1
Gооd_Mаn 7 avril 2020 à 18:06

3 réponses

Meilleure réponse

Vous pouvez définir un decorator

import functools
def inspect(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):

        print('start')
        print('of ')
        print('a code')

        value = func(*args, **kwargs)

        print('end')
        print('of')
        print('the code')

        return value
    return wrapper

Ensuite, utilisez-le simplement:

@inspect
def my_func ( arg ) :
    # Do something
    print( "my_func is called with arg =" , arg) 

Vous pouvez en apprendre de plus en plus sur les décorateurs: Introduction sur les décorateurs Python

3
AmirHmZ 7 avril 2020 à 15:21

En plus d'un décorateur, il s'agit d'un cas d'utilisation pour un gestionnaire de contexte. Il existe plusieurs façons de définir un gestionnaire de contexte, mais je vais en montrer une qui vous permet également de l'utiliser comme décorateur.

from contextlib import ContextDecorator


class context(ContextDecorator):
    def __enter__(self):
        print('start')
        print('of ')
        print('a code')

    def __exit__(self, *exc):
        print('end')
        print('of')
        print('the code')

Ensuite, vous pouvez écrire soit

@context
def foo1():
    ...

Ou

def foo1():
    with context():
        ...

Selon vos besoins spécifiques, un gestionnaire de contexte ou un décorateur peut être plus approprié.

2
chepner 7 avril 2020 à 15:20

peut-être en utilisant l'héritage de classe

Dans OO, il s'agit du modèle de "méthode modèle":

class Base:
    def run(self, *args, **kw):
        print('start')
        print('of ')
        print('a code')

        value = self.method(*args, **kwargs)

        print('end')
        print('of')
        print('the code')

        return value


    def method(self, *args, **kw):
        return None


class Child(Base):
    def method(self, *args, **kw):
        return 42


c = Child()
c.run()

Mais je ne conseillerais pas d'utiliser des classes et l'héritage lorsque vous n'en avez pas besoin.

0
bruno desthuilliers 7 avril 2020 à 16:23