Apprendre Python depuis tant d'années? Vous ne pouvez même pas écrire des fonctions génériques?

Génériques, si vous avez goûté au java, vous devriez le connaître. Mais vous ne savez peut-être pas que des fonctions génériques simples peuvent également être implémentées en Python (3.4+).

En Python, seule la méthode d'implémentation spécifique peut être sélectionnée en fonction du type de données d'un (premier) paramètre unique. Le nom officiel est single-dispatch. Vous ne le comprenez peut-être pas. En termes humains, il est possible de se rendre compte que le type de données du premier paramètre est différent, et la fonction qu'il appelle est également différente.

singledispatchIl a été introduit dans PEP443. Si cela vous intéresse, PEP443 devrait être le meilleur document d'apprentissage: https://www.python.org/dev/peps/pep-0443/

Son utilisation est extrêmement simple, tant que la singledispatchfonction décorée est une single-dispatchfonction générique de ( generic functions).

  • Envoi unique : Action d'effectuer la même opération de différentes manières selon le type d'un paramètre.
  • Envoi multiple : Le comportement d'une fonction spéciale peut être sélectionné en fonction des types de paramètres multiples.
  • Fonction générique : plusieurs fonctions sont liées entre elles pour former une fonction générique.

Voici un exemple simple.

from functools import singledispatch

@singledispatch
def age(obj):
    print('请传入合法类型的参数!')

@age.register(int)
def _(age):
    print('我已经{}岁了。'.format(age))

@age.register(str)
def _(age):
    print('I am {} years old.'.format(age))


age(23)  # int
age('twenty three')  # str
age(['23'])  # list

Résultats de la

我已经23岁了。
I am twenty three years old.
请传入合法类型的参数!

En parlant de génériques, en effet, pas rare dans certaines fonctions intégrées Python lui - même, comme len(), iter(), copy.copy(), pprint()etc.

Vous pouvez demander, à quoi cela sert-il? En fait, c'est vraiment inutile. Si vous ne l'utilisez pas ou ne le savez pas, cela n'affectera pas du tout votre codage.

Laissez-moi vous donner un exemple, vous pouvez le sentir.

Tout le monde sait qu'il existe de nombreux types de données en Python, tels que str, list, dict, tuple, etc. Les méthodes d'épissage de différents types de données sont différentes, alors j'ai écrit ici une fonction générale qui peut être basée sur le type de données correspondant Sélectionnez la méthode d'épissage correspondante pour l'épissage, et pour différents types de données, je devrais également indiquer que l'épissage n'est pas possible. Ce qui suit est une implémentation simple.

def check_type(func):
    def wrapper(*args):
        arg1, arg2 = args[:2]
        if type(arg1) != type(arg2):
            return '【错误】:参数类型不同,无法拼接!!'
        return func(*args)
    return wrapper


@singledispatch
def add(obj, new_obj):
    raise TypeError

@add.register(str)
@check_type
def _(obj, new_obj):
    obj += new_obj
    return obj


@add.register(list)
@check_type
def _(obj, new_obj):
    obj.extend(new_obj)
    return obj

@add.register(dict)
@check_type
def _(obj, new_obj):
    obj.update(new_obj)
    return obj

@add.register(tuple)
@check_type
def _(obj, new_obj):
    return (*obj, *new_obj)

print(add('hello',', world'))
print(add([1,2,3], [4,5,6]))
print(add({'name': 'wangbm'}, {'age':25}))
print(add(('apple', 'huawei'), ('vivo', 'oppo')))

# list 和 字符串 无法拼接
print(add([1,2,3], '4,5,6'))

La sortie est la suivante

hello, world
[1, 2, 3, 4, 5, 6]
{'name': 'wangbm', 'age': 25}
('apple', 'huawei', 'vivo', 'oppo')
【错误】:参数类型不同,无法拼接!!

Si vous n'utilisez pas singledispatch, vous pouvez écrire un tel code.

def check_type(func):
    def wrapper(*args):
        arg1, arg2 = args[:2]
        if type(arg1) != type(arg2):
            return '【错误】:参数类型不同,无法拼接!!'
        return func(*args)
    return wrapper

@check_type
def add(obj, new_obj):
    if isinstance(obj, str) :
        obj += new_obj
        return obj

    if isinstance(obj, list) :
        obj.extend(new_obj)
        return obj

    if isinstance(obj, dict) :
        obj.update(new_obj)
        return obj

    if isinstance(obj, tuple) :
        return (*obj, *new_obj)

print(add('hello',', world'))
print(add([1,2,3], [4,5,6]))
print(add({'name': 'wangbm'}, {'age':25}))
print(add(('apple', 'huawei'), ('vivo', 'oppo')))

# list 和 字符串 无法拼接
print(add([1,2,3], '4,5,6'))

La sortie est la suivante

hello, world
[1, 2, 3, 4, 5, 6]
{'name': 'wangbm', 'age': 25}
('apple', 'huawei', 'vivo', 'oppo')
【错误】:参数类型不同,无法拼接!!

Je recommande mon e-book original " PyCharm Chinese Guide ", qui contient un grand nombre (300) d'illustrations, il est bien fait et digne d'une collection par chaque ingénieur Python.

L'adresse est: http://pycharm.iswbm.com

Je suppose que tu aimes

Origine blog.csdn.net/weixin_36338224/article/details/109014854
conseillé
Classement