Изучаете Python столько лет? Не можете даже написать общие функции?

Дженерики, если вы пробовали java, вы должны быть с ним знакомы. Но вы можете не знать, что простые универсальные функции также могут быть реализованы в Python (3.4+).

В Python можно выбрать только конкретный метод реализации в зависимости от типа данных одного (первого) параметра. Официальное название - single-dispatch. Вы можете этого не понять.Человечески говоря, можно понять, что тип данных первого параметра отличается, и функция, которую он вызывает, также отличается.

singledispatchОн был представлен в PEP443. Если он вам интересен, PEP443 должен быть лучшим учебным документом: https://www.python.org/dev/peps/pep-0443/

Его использование чрезвычайно просто, если singledispatchоформленная функция является single-dispatchобщей функцией ( generic functions).

  • Единичная отправка : выполнение одной и той же операции разными способами в зависимости от типа параметра.
  • Множественная отправка : поведение специальной функции может быть выбрано в соответствии с типами нескольких параметров.
  • Общая функция : несколько функций связаны вместе, чтобы сформировать общую функцию.

Вот простой пример.

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

Результаты

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

Говоря о дженерик, на самом деле, не редкость в некоторых встроенных функциях самого Python, такой как len(), iter(), copy.copy(), и pprint()т.д.

Вы спросите, а какая от этого польза? На самом деле, это действительно бесполезно: если вы его не используете или не знаете, это никак не повлияет на ваше кодирование.

Приведу пример, вы это почувствуете.

Всем известно, что в Python существует множество типов данных, таких как str, list, dict, tuple и т. Д. Методы сращивания разных типов данных различны, поэтому здесь я написал общую функцию, которая может быть основана на соответствующем типе данных. Выберите соответствующий метод сращивания для сращивания, и для разных типов данных я должен также указать, что сращивание невозможно. Ниже приводится простая реализация.

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'))

Результат выглядит следующим образом

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

Если вы не используете singledispatch, вы можете написать такой код.

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'))

Результат выглядит следующим образом

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

Я рекомендую мою оригинальную « PyCharm китайского Guide » электронную книгу, которая содержит большое количество (300) иллюстраций . Это хорошо сделано и достойны коллекций каждого инженера Python.

Адрес: http://pycharm.iswbm.com

рекомендация

отblog.csdn.net/weixin_36338224/article/details/109014854
рекомендация