¿Aprendiendo Python durante tantos años? ¿Ni siquiera puedes escribir funciones genéricas?

Genéricos, si ha probado Java, debería estar familiarizado con él. Pero es posible que no sepa que las funciones genéricas simples también se pueden implementar en Python (3.4+).

En Python, solo se puede seleccionar el método de implementación específico en función del tipo de datos de un único (primer) parámetro. El nombre oficial es single-dispatch. Puede que no lo entiendas En términos humanos, es posible darse cuenta de que el tipo de datos del primer parámetro es diferente, y la función que llama también es diferente.

singledispatchFue introducido en PEP443. Si está interesado en él, PEP443 debería ser el mejor documento de aprendizaje: https://www.python.org/dev/peps/pep-0443/

Su uso es sumamente sencillo, siempre que la singledispatchfunción decorada sea una single-dispatchfunción genérica de ( generic functions).

  • Despacho único : El comportamiento de realizar la misma operación de diferentes formas según el tipo de parámetro.
  • Despacho múltiple : el comportamiento de una función especial se puede seleccionar de acuerdo con los tipos de parámetros múltiples.
  • Función genérica : múltiples funciones están unidas para formar una función genérica.

He aquí un ejemplo sencillo.

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

Resultados de la

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

Hablando de los genéricos, de hecho, no es infrecuente en algunas funciones incorporadas de Python en sí, como por ejemplo len(), iter(), copy.copy(), pprint()etc.

Puede preguntar, ¿de qué sirve? De hecho, es realmente inútil, si no lo usa o no lo sabe, no afectará en absoluto su codificación.

Déjame darte un ejemplo, puedes sentirlo.

Todo el mundo sabe que hay muchos tipos de datos en Python, como str, list, dict, tuple, etc. Los métodos de empalme de diferentes tipos de datos son diferentes, así que aquí escribí una función general que puede basarse en el tipo de datos correspondiente Seleccione el método de empalme correspondiente para empalmar, y para diferentes tipos de datos, también se me debe indicar que el empalme no es posible. La siguiente es una implementación 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 salida es la siguiente

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

Si no usa singledispatch, puede escribir dicho código.

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 salida es la siguiente

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

Recomiendo mi libro electrónico original " PyCharm Chinese Guide ", que contiene una gran cantidad (300) de ilustraciones , está bien hecho y es digno de una colección de todos los ingenieros de Python.

La dirección es: http://pycharm.iswbm.com

Supongo que te gusta

Origin blog.csdn.net/weixin_36338224/article/details/109014854
Recomendado
Clasificación