Еще 3 совета по функциональным инструментам Python

Модуль Functools необходим для написания чистого, читабельного и многократно используемого кода на Python. Вы можете прочитать другую статью под названием 3 совета Python Functools, если хотите узнать о повышении производительности.

В этой статье вы узнаете еще о трех советах Python Functools – предопределенных функциях, одиночной диспетчеризации и полном упорядочивании.

Частичные или предопределенные функции

Предопределенные функции – это создание версии функции путем присвоения значений ее аргументам.

from functools import partial

def add(a, b):
  print(a + b)

                              # order of the arguments maters
add2and5 = partial(add, 2, 5) # 2 for a, 5 for b
add2and1 = partial(add, 2, 1) # 2 for a, 1 for b

add2and2()
add2and1()

Singledispatch | Generics

singledispatch – это декоратор, который используется для создания версий функции для разных типов данных. Эта функция может вести себя по-разному для разных типов данных.

Для того чтобы использовать singledispatch с функцией, мы должны написать версии, в которых поведение функции будет изменено, и версию для общего использования.

from functools import singledispatch

@singledispatch
def append(obj, x):
    print("Unsupported type")

@append.register
def _(obj: list, x: list):
    return obj + x

@append.register
def _(obj: set, x: set):
    return obj.union(x)

@append.register
def _(obj: str, x: str):
    return obj + x

print(append([1, 2, 3], [4, 5]))
print(append({1, 2, 3}, {4, 5}))
print(append("1 2 3", " 4 5"), "\n")

If the type is not supported, the original function is called
append(2, 3)

В этом примере функция с декоратором singledispatch – это версия, которую мы хотим запускать для неопределенных типов данных.

Другие версии с декоратором append.register – это версии для определенных типов данных. Как вы заметили, декоратор начинается с имени функции, с которой мы работаем (в данном случае append). Кроме того, другие функции имеют имя_.

Для указания типов используйте аннотации типов.

Общий заказ

total_ordering используется для автоматического определения lt(), le(), gt(), ge() на основе, eg() и одного из четырех методов класса. Эти методы – меньше, чем, меньше или равно, больше, чем, больше или равно, и равные методы (<, <=, >, >=).

from functools import total_ordering

@total_ordering
class Circle:
  def __init__(self, radius):
        self.radius = radius

  def __eq__(self, other):
        return self.radius == other.radius

  def __lt__(self, other):
        return self.radius < other.radius

studentA = Circle(10)
studentB = Circle(12)

# all compressions are working even if we don't define all four
print(studentA == studentB)
print(studentA != studentB)
print(studentA < studentB)
print(studentA <= studentB)
print(studentA > studentB)
print(studentA >= studentB)

В этом примере классCircle имеет только методы eq и lt, но каждая операция работает отлично благодаря tototal_ordering.

Пишите меньше, делайте больше.

+1
0
+1
0
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *