Python

Equivalencias idiomáticas entre Kotlin y Python. Kotlin se presenta como referencia en cada concepto.

Funciones y abstracciones de comportamiento

Tratar funciones como valores es la base para leer y escribir el resto de las comparaciones: sin esto, los mecanismos posteriores parecen sintaxis arbitraria.

Equivalencia desde Kotlin

Comportamiento como valor

Cercana

Python vincula el nombre declarado con un objeto función; ese objeto puede pasarse como argumento. Las anotaciones de tipo son opcionales en tiempo de ejecución.

Referencia Kotlin: Declarar una operación reutilizable y recibir otra operación como valor.

Mecanismo
def para declarar funciones y Callable para documentar la firma esperada.
Idea conservada
La transformación se recibe como valor y se invoca dos veces sobre el mismo argumento; quien la declara no necesita conocer apply_twice.
Riesgo de diseño
Usar un valor mutable como argumento por omisión y esperar que se cree de nuevo en cada llamada.
Recomendación
Usa anotaciones para comunicar la firma pública y None como centinela para valores mutables por omisión.
Convención del curso
Anota la firma pública y evita valores mutables como argumento por omisión.
Mecanismo del lenguaje
def y expresiones lambda.
Biblioteca estándar
collections.abc.Callable para anotar la firma esperada.

Diferencias relevantes

  • La indentación delimita el cuerpo de la función.
  • Callable documenta la intención para herramientas de tipos, pero Python no la impone automáticamente al ejecutar.

La función recibida se anota como Callable.

Kotlin
fun applyTwice(
    value: Int,
    transform: (Int) -> Int,
): Int = transform(transform(value))

val result = applyTwice(3) { it + 1 } // 5
Python
from collections.abc import Callable

def apply_twice(value: int, transform: Callable[[int], int]) -> int:
    return transform(transform(value))

result = apply_twice(3, lambda number: number + 1)  # 5

Otra forma de recibir comportamiento: un predicado para filtrar una lista.

def keep(xs: list[int], p: Callable[[int], bool]) -> list[int]:
    return [x for x in xs if p(x)]

Fuentes

Equivalencia desde Kotlin

Parámetros variádicos

Cercana

En Python, parámetro *values expresa la responsabilidad del fixture: Suma una cantidad variable de enteros.

Referencia Kotlin: Una función recibe vararg values: Int.

Mecanismo
parámetro *values
Riesgo de diseño
Copiar la sintaxis de Kotlin en vez de usar parámetro *values.
Recomendación
Expón el contrato del fixture y usa parámetro *values solo para la garantía que realmente ofrece.

Diferencias relevantes

  • Distingue una llamada variádica de recibir explícitamente una colección.
  • La forma idiomática de Python debe conservarse aunque la sintaxis difiera de Kotlin.

Suma una cantidad variable de enteros.

def sum_values(*values: int) -> int:
    return sum(values)

Fuentes

Equivalencia desde Kotlin

Interfaces

Cercana

En Python, Protocol estructural para herramientas de tipos expresa la responsabilidad del fixture: Permite reemplazar un proveedor de resultados por su contrato.

Referencia Kotlin: Una interfaz declara comportamiento sin fijar una representación.

Mecanismo
Protocol estructural para herramientas de tipos
Riesgo de diseño
Copiar la sintaxis de Kotlin en vez de usar Protocol estructural para herramientas de tipos.
Recomendación
Expón el contrato del fixture y usa Protocol estructural para herramientas de tipos solo para la garantía que realmente ofrece.

Diferencias relevantes

  • La conformidad puede ser nominal, estructural o basada en traits; no son la misma garantía.
  • La forma idiomática de Python debe conservarse aunque la sintaxis difiera de Kotlin.

Permite reemplazar un proveedor de resultados por su contrato.

class Score(Protocol):
    def value(self) -> int: ...

Fuentes