Еще 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.
Пишите меньше, делайте больше.