# Desusos

## Eliminación pendiente en Python 3.14

- `argparse`: Los parámetros type, choices y metavar de `argparse.BooleanOptionalAction` están obsoletos y se eliminarán en la versión 3.14. (Contribuido por Nikita Sobolev en gh-92248.)

- `ast`: Las siguientes funciones han quedado obsoletas en la documentación desde Python 3.8, ahora hacen que se emita un `DeprecationWarning` en tiempo de ejecución cuando se accede a ellas o se las utiliza, y se eliminarán en Python 3.14:

  - `ast.Num`

  - `ast.Str`

  - `ast.Bytes`

  - `ast.NameConstant`

  - `ast.Ellipsis`

  Utilice `ast.Constant` en su lugar. (Contribuido por Serhiy Storchaka en gh-90953.)

- `asyncio`:

  - Las clases de supervisión secundaria `MultiLoopChildWatcher`, `FastChildWatcher`, `AbstractChildWatcher` y `SafeChildWatcher` están obsoletas y se eliminarán en Python 3.14. (Contribuido por Kumar Aditya en gh-94597.)

  - `asyncio.set_child_watcher()`, `asyncio.get_child_watcher()`, `asyncio.AbstractEventLoopPolicy.set_child_watcher()` y `asyncio.AbstractEventLoopPolicy.get_child_watcher()` están obsoletos y se eliminarán en Python 3.14. (Contribuido por Kumar Aditya en gh-94597.)

  - El método `get_event_loop()` de la política de bucle de eventos predeterminada ahora emite un `DeprecationWarning` si no hay ningún bucle de eventos definido actualmente y decide crear uno. (Contribuido por Serhiy Storchaka y Guido van Rossum en gh-100160.)

- `builtins`: `bool(NotImplemented)` now emits a `DeprecationWarning` and will raise a `TypeError` in Python 3.14. (Contributed by Jelle Zijlstra in gh-118767.)

- `email`: Se ha descontinuado el parámetro isdst en `email.utils.localtime()`. (Contribuido por Alan Williams en gh-72346.)

- Clases obsoletas de `importlib.abc`:

  - `importlib.abc.ResourceReader`

  - `importlib.abc.Traversable`

  - `importlib.abc.TraversableResources`

  Utilice clases `importlib.resources.abc` en su lugar:

  - `importlib.resources.abc.Traversable`

  - `importlib.resources.abc.TraversableResources`

  (Contribuido por Jason R. Coombs y Hugo van Kemenade en gh-93963.)

- `itertools` tenía un soporte indocumentado, ineficiente, históricamente lleno de errores e inconsistente para operaciones de copia, copia profunda y pickle. Esto se eliminará en la versión 3.14 para lograr una reducción significativa en el volumen de código y la carga de mantenimiento. (Contribuido por Raymond Hettinger en gh-101588.)

- `multiprocessing`: El método de inicio predeterminado cambiará a uno más seguro en Linux, BSD y otras plataformas POSIX que no sean macOS donde `'fork'` es actualmente el predeterminado (gh-84559). Agregar una advertencia de tiempo de ejecución sobre esto se consideró demasiado disruptivo ya que no se espera que la mayoría del código tenga en cuenta esto. Use las API `get_context()` o `set_start_method()` para especificar explícitamente cuándo su código requires `'fork'`. Consulte Contextos y métodos de inicio.

- `pathlib`: `is_relative_to()` y `relative_to()`: pasar argumentos adicionales está obsoleto.

- `pkgutil`: `find_loader()` y `get_loader()` ahora generan `DeprecationWarning`; utilice `importlib.util.find_spec()` en su lugar. (Contribuido por Nikita Sobolev en gh-97850.)

- `pty`:

  - `master_open()`: utilice `pty.openpty()`.

  - `slave_open()`: utilice `pty.openpty()`.

- `sqlite3`:

  - `version` y `version_info`.

  - `execute()` y `executemany()` si se utilizan named placeholders y parameters es una secuencia en lugar de `dict`.

- `urllib`: `urllib.parse.Quoter` está obsoleto: no estaba previsto que fuera una API pública. (Contribuido por Gregory P. Smith en gh-88168.)

## Eliminación pendiente en Python 3.15

- The import system:

  - Setting `__cached__` on a module while failing to set `__spec__.cached` is deprecated. In Python 3.15, `__cached__` will cease to be set or take into consideration by the import system or standard library. (gh-97879)

  - Setting `__package__` on a module while failing to set `__spec__.parent` is deprecated. In Python 3.15, `__package__` will cease to be set or take into consideration by the import system or standard library. (gh-97879)

- `ctypes`:

  - La función `ctypes.SetPointerType()` no documentada ha quedado obsoleta desde Python 3.13.

- `http.server`:

  - El obsoleto y poco utilizado `CGIHTTPRequestHandler` ha quedado obsoleto desde Python 3.13. No existe un reemplazo directo. Anything es mejor que CGI para interconectar un servidor web con un controlador de solicitudes.

  - La bandera `--cgi` de la interfaz de línea de comandos python -m http.server ha quedado obsoleta desde Python 3.13.

- `importlib`:

  - Método `load_module()`: utilice `exec_module()` en su lugar.

- `locale`:

  - La función `getdefaultlocale()` ha quedado obsoleta desde Python 3.11. Su eliminación se había planeado originalmente para Python 3.13 (gh-90817), pero se pospuso hasta Python 3.15. Utilice `getlocale()`, `setlocale()` y `getencoding()` en su lugar. (Contribuido por Hugo van Kemenade en gh-111187.)

- `pathlib`:

  - `PurePath.is_reserved()` ha quedado obsoleto desde Python 3.13. Utilice `os.path.isreserved()` para detectar rutas reservadas en Windows.

- `platform`:

  - `java_ver()` ha quedado obsoleto desde Python 3.13. Esta función solo es útil para la compatibilidad con Jython, tiene una API confusa y, en gran medida, no se ha probado.

- `sysconfig`:

  - The check_home argument of `sysconfig.is_python_build()` has been deprecated since Python 3.12.

- `threading`:

  - `RLock()` no acepta argumentos en Python 3.15. El paso de cualquier argumento ha quedado obsoleto desde Python 3.14, ya que la versión de Python no permite ningún argumento, pero la versión de C permite cualquier cantidad de argumentos posicionales o de palabras clave, ignorando todos los argumentos.

- `types`:

  - `types.CodeType`: Accessing `co_lnotab` was deprecated in PEP 626 since 3.10 and was planned to be removed in 3.12, but it only got a proper `DeprecationWarning` in 3.12. May be removed in 3.15. (Contributed by Nikita Sobolev in gh-101866.)

- `typing`:

  - La sintaxis de argumentos de palabras clave no documentada para crear clases `NamedTuple` (p. ej., `Point = NamedTuple("Point", x=int, y=int)`) ha quedado obsoleta desde Python 3.13. En su lugar, utilice la sintaxis basada en clases o la sintaxis funcional.

  - When using the functional syntax of `TypedDict`s, failing to pass a value to the fields parameter (`TD = TypedDict("TD")`) or passing `None` (`TD = TypedDict("TD", None)`) has been deprecated since Python 3.13. Use `class TD(TypedDict): pass` or `TD = TypedDict("TD", {})` to create a TypedDict with zero field.

  - La función decoradora `typing.no_type_check_decorator()` ha quedado obsoleta desde Python 3.13. Después de ocho años en el módulo `typing`, todavía no ha sido compatible con ningún verificador de tipos importante.

- `wave`:

  - Los métodos `getmark()`, `setmark()` y `getmarkers()` de las clases `Wave_read` y `Wave_write` han quedado obsoletos desde Python 3.13.

## Pending removal in Python 3.16

- The import system:

  - Setting `__loader__` on a module while failing to set `__spec__.loader` is deprecated. In Python 3.16, `__loader__` will cease to be set or taken into consideration by the import system or the standard library.

- `array`:

  - El código de formato `'u'` (`wchar_t`) ha quedado obsoleto en la documentación desde Python 3.3 y en el entorno de ejecución desde Python 3.13. Utilice el código de formato `'w'` (`Py_UCS4`) para caracteres Unicode.

- `asyncio`:

  - `asyncio.iscoroutinefunction()` is deprecated and will be removed in Python 3.16, use `inspect.iscoroutinefunction()` instead. (Contributed by Jiahao Li and Kumar Aditya in gh-122875.)

- `builtins`:

  - La inversión bit a bit en tipos booleanos, `~True` o `~False`, ha quedado obsoleta desde Python 3.12, ya que produce resultados sorprendentes y poco intuitivos (`-2` y `-1`). En su lugar, utilice `not x` para la negación lógica de un valor booleano. En el caso poco frecuente de que necesite la inversión bit a bit del entero subyacente, convierta a `int` explícitamente (`~int(x)`).

- `shutil`:

  - La excepción `ExecError` ha quedado obsoleta desde Python 3.14. No ha sido utilizada por ninguna función en `shutil` desde Python 3.4 y ahora es un alias de `RuntimeError`.

- `symtable`:

  - El método `Class.get_methods` ha quedado obsoleto desde Python 3.14.

- `sys`:

  - La función `_enablelegacywindowsfsencoding()` ha quedado obsoleta desde Python 3.13. En su lugar, utilice la variable de entorno `PYTHONLEGACYWINDOWSFSENCODING`.

- `tarfile`:

  - El atributo `TarFile.tarfile`, no documentado ni utilizado, ha quedado obsoleto desde Python 3.13.

## Pending removal in Python 3.17

- `collections.abc`:

  - `collections.abc.ByteString` is scheduled for removal in Python 3.17.

    Use `isinstance(obj, collections.abc.Buffer)` to test if `obj` implements the buffer protocol at runtime. For use in type annotations, either use `Buffer` or a union that explicitly specifies the types your code supports (e.g., `bytes | bytearray | memoryview`).

    `ByteString` was originally intended to be an abstract class that would serve as a supertype of both `bytes` and `bytearray`. However, since the ABC never had any methods, knowing that an object was an instance of `ByteString` never actually told you anything useful about the object. Other common buffer types such as `memoryview` were also never understood as subtypes of `ByteString` (either at runtime or by static type checkers).

    See PEP 688 for more details. (Contributed by Shantanu Jain in gh-91896.)

- `typing`:

  - Before Python 3.14, old-style unions were implemented using the private class `typing._UnionGenericAlias`. This class is no longer needed for the implementation, but it has been retained for backward compatibility, with removal scheduled for Python 3.17. Users should use documented introspection helpers like `typing.get_origin()` and `typing.get_args()` instead of relying on private implementation details.

  - `typing.ByteString`, deprecated since Python 3.9, is scheduled for removal in Python 3.17.

    Use `isinstance(obj, collections.abc.Buffer)` to test if `obj` implements the buffer protocol at runtime. For use in type annotations, either use `Buffer` or a union that explicitly specifies the types your code supports (e.g., `bytes | bytearray | memoryview`).

    `ByteString` was originally intended to be an abstract class that would serve as a supertype of both `bytes` and `bytearray`. However, since the ABC never had any methods, knowing that an object was an instance of `ByteString` never actually told you anything useful about the object. Other common buffer types such as `memoryview` were also never understood as subtypes of `ByteString` (either at runtime or by static type checkers).

    See PEP 688 for more details. (Contributed by Shantanu Jain in gh-91896.)

## Pending removal in Python 3.18

- `decimal`:

  - The non-standard and undocumented `Decimal` format specifier `'N'`, which is only supported in the `decimal` module’s C implementation, has been deprecated since Python 3.13. (Contributed by Serhiy Storchaka in gh-89902.)

## Pendiente de eliminación en futuras versiones

Las siguientes API se eliminarán en el futuro, aunque actualmente no hay una fecha programada para su eliminación.

- `argparse`: Los grupos de argumentos anidados y los grupos mutuamente excluyentes anidados están obsoletos.

- `builtins`:

  - Generadores: las firmas `throw(type, exc, tb)` y `athrow(type, exc, tb)` están obsoletas: utilice `throw(exc)` y `athrow(exc)` en su lugar, la firma de argumento único.

  - Actualmente, Python acepta literales numéricos seguidos inmediatamente de palabras clave, por ejemplo, `0in x`, `1or x`, `0if 1else 2`. Permite expresiones confusas y ambiguas como `[0x1for x in y]` (que se puede interpretar como `[0x1 for x in y]` o `[0x1f or x in y]`). Se genera una advertencia de sintaxis si el literal numérico va seguido inmediatamente de una de las palabras clave `and`, `else`, `for`, `if`, `in`, `is` y `or`. En una versión futura, se cambiará a un error de sintaxis. (gh-87999)

  - Compatibilidad con los métodos `__index__()` y `__int__()` que devuelven un tipo que no es int: estos métodos serán necesarios para devolver una instancia de una subclase estricta de `int`.

  - Compatibilidad con el método `__float__()` que devuelve una subclase estricta de `float`: estos métodos serán necesarios para devolver una instancia de `float`.

  - Compatibilidad con el método `__complex__()` que devuelve una subclase estricta de `complex`: estos métodos serán necesarios para devolver una instancia de `complex`.

  - Delegación del método `int()` al `__trunc__()`.

  - Ahora está obsoleto el paso de un número complejo como argumento real o imag en el constructor `complex()`; solo debe pasarse como un único argumento posicional. (Contribuido por Serhiy Storchaka en gh-109218.)

- `calendar`: Las constantes `calendar.January` y `calendar.February` han quedado obsoletas y han sido reemplazadas por `calendar.JANUARY` y `calendar.FEBRUARY`. (Contribuido por Prince Roshan en gh-103636.)

- `codeobject.co_lnotab`: utilice el método `codeobject.co_lines()` en su lugar.

- `datetime`:

  - `utcnow()`: utilice `datetime.datetime.now(tz=datetime.UTC)`.

  - `utcfromtimestamp()`: utilice `datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)`.

- `gettext`: El valor plural debe ser un número entero.

- `importlib`:

  - `cache_from_source()` El parámetro debug_override está obsoleto: utilice el parámetro optimization en su lugar.

- `importlib.metadata`:

  - Interfaz de tupla `EntryPoints`.

  - `None` implícito en los valores de retorno.

- `logging`: el método `warn()` ha quedado obsoleto desde Python 3.3, utilice `warning()` en su lugar.

- `mailbox`: El uso del modo de entrada y texto StringIO está obsoleto; en su lugar, utilice BytesIO y el modo binario.

- `os`: Llamada a `os.register_at_fork()` en un proceso multiproceso.

- `pydoc.ErrorDuringImport`: Un valor de tupla para el parámetro exc_info está obsoleto, utilice una instancia de excepción.

- `re`: Ahora se aplican reglas más estrictas para las referencias numéricas de grupos y los nombres de grupos en expresiones regulares. Ahora solo se aceptan secuencias de dígitos ASCII como referencia numérica. El nombre de grupo en patrones de bytes y cadenas de reemplazo ahora solo puede contener letras y dígitos ASCII y guiones bajos. (Contribuido por Serhiy Storchaka en gh-91760.)

- Módulos `sre_compile`, `sre_constants` y `sre_parse`.

- `shutil`: El parámetro onerror de `rmtree()` está obsoleto en Python 3.12; utilice el parámetro onexc en su lugar.

- Opciones y protocolos `ssl`:

  - `ssl.SSLContext` sin argumento de protocolo está obsoleto.

  - `ssl.SSLContext`: `set_npn_protocols()` y `selected_npn_protocol()` están obsoletos: utilice ALPN en su lugar.

  - Opciones de `ssl.OP_NO_SSL*`

  - Opciones de `ssl.OP_NO_TLS*`

  - `ssl.PROTOCOL_SSLv3`

  - `ssl.PROTOCOL_TLS`

  - `ssl.PROTOCOL_TLSv1`

  - `ssl.PROTOCOL_TLSv1_1`

  - `ssl.PROTOCOL_TLSv1_2`

  - `ssl.TLSVersion.SSLv3`

  - `ssl.TLSVersion.TLSv1`

  - `ssl.TLSVersion.TLSv1_1`

- Métodos `threading`:

  - `threading.Condition.notifyAll()`: utilice `notify_all()`.

  - `threading.Event.isSet()`: utilice `is_set()`.

  - `threading.Thread.isDaemon()`, `threading.Thread.setDaemon()`: utilice el atributo `threading.Thread.daemon`.

  - `threading.Thread.getName()`, `threading.Thread.setName()`: utilice el atributo `threading.Thread.name`.

  - `threading.currentThread()`: utilice `threading.current_thread()`.

  - `threading.activeCount()`: utilice `threading.active_count()`.

- `typing.Text` (gh-92332).

- `unittest.IsolatedAsyncioTestCase`: está obsoleto devolver un valor que no sea `None` de un caso de prueba.

- Funciones obsoletas de `urllib.parse`: `urlparse()` en su lugar

  - `splitattr()`

  - `splithost()`

  - `splitnport()`

  - `splitpasswd()`

  - `splitport()`

  - `splitquery()`

  - `splittag()`

  - `splittype()`

  - `splituser()`

  - `splitvalue()`

  - `to_bytes()`

- `urllib.request`: el estilo `URLopener` y `FancyURLopener` de invocar solicitudes está obsoleto. Utilice las funciones y métodos `urlopen()` más nuevos.

- `wsgiref`: `SimpleHandler.stdout.write()` no debería realizar escrituras parciales.

- `xml.etree.ElementTree`: La prueba del valor de verdad de un `Element` está obsoleta. En una versión futura, siempre devolverá `True`. En su lugar, es preferible realizar pruebas explícitas `len(elem)` o `elem is not None`.

- `zipimport.zipimporter.load_module()` está obsoleto: utilice `exec_module()` en su lugar.

## Desuso de la API C

### Eliminación pendiente en Python 3.14

- El campo `ma_version_tag` en `PyDictObject` para módulos de extensión (PEP 699; gh-101193).

- Creando `immutable types` con bases mutables (gh-95388).

- Funciones para configurar la inicialización de Python, obsoletas en Python 3.11:

  - `PySys_SetArgvEx()`: Establezca `PyConfig.argv` en su lugar.

  - `PySys_SetArgv()`: Establezca `PyConfig.argv` en su lugar.

  - `Py_SetProgramName()`: Establezca `PyConfig.program_name` en su lugar.

  - `Py_SetPythonHome()`: Establezca `PyConfig.home` en su lugar.

  La API `Py_InitializeFromConfig()` debe utilizarse con `PyConfig`.

- Variables de configuración global:

  - `Py_DebugFlag`: Utilice `PyConfig.parser_debug` en su lugar.

  - `Py_VerboseFlag`: Utilice `PyConfig.verbose` en su lugar.

  - `Py_QuietFlag`: Utilice `PyConfig.quiet` en su lugar.

  - `Py_InteractiveFlag`: Utilice `PyConfig.interactive` en su lugar.

  - `Py_InspectFlag`: Utilice `PyConfig.inspect` en su lugar.

  - `Py_OptimizeFlag`: Utilice `PyConfig.optimization_level` en su lugar.

  - `Py_NoSiteFlag`: Utilice `PyConfig.site_import` en su lugar.

  - `Py_BytesWarningFlag`: Utilice `PyConfig.bytes_warning` en su lugar.

  - `Py_FrozenFlag`: Utilice `PyConfig.pathconfig_warnings` en su lugar.

  - `Py_IgnoreEnvironmentFlag`: Utilice `PyConfig.use_environment` en su lugar.

  - `Py_DontWriteBytecodeFlag`: Utilice `PyConfig.write_bytecode` en su lugar.

  - `Py_NoUserSiteDirectory`: Utilice `PyConfig.user_site_directory` en su lugar.

  - `Py_UnbufferedStdioFlag`: Utilice `PyConfig.buffered_stdio` en su lugar.

  - `Py_HashRandomizationFlag`: Utilice `PyConfig.use_hash_seed` y `PyConfig.hash_seed` en su lugar.

  - `Py_IsolatedFlag`: Utilice `PyConfig.isolated` en su lugar.

  - `Py_LegacyWindowsFSEncodingFlag`: Utilice `PyPreConfig.legacy_windows_fs_encoding` en su lugar.

  - `Py_LegacyWindowsStdioFlag`: Utilice `PyConfig.legacy_windows_stdio` en su lugar.

  - `Py_FileSystemDefaultEncoding`: Utilice `PyConfig.filesystem_encoding` en su lugar.

  - `Py_HasFileSystemDefaultEncoding`: Utilice `PyConfig.filesystem_encoding` en su lugar.

  - `Py_FileSystemDefaultEncodeErrors`: Utilice `PyConfig.filesystem_errors` en su lugar.

  - `Py_UTF8Mode`: Utilice `PyPreConfig.utf8_mode` en su lugar. (ver `Py_PreInitialize()`)

  La API `Py_InitializeFromConfig()` debe utilizarse con `PyConfig`.

### Eliminación pendiente en Python 3.15

- `PyImport_ImportModuleNoBlock()`: utilice `PyImport_ImportModule()` en su lugar.

- `PyWeakref_GetObject()` y `PyWeakref_GET_OBJECT()`: utilice `PyWeakref_GetRef()` en su lugar.

- Tipo `Py_UNICODE` y macro `Py_UNICODE_WIDE`: utilice `wchar_t` en su lugar.

- Funciones de inicialización de Python:

  - `PySys_ResetWarnOptions()`: borre `sys.warnoptions` y `warnings.filters` en su lugar.

  - `Py_GetExecPrefix()`: Get `sys.base_exec_prefix` and `sys.exec_prefix` instead.

  - `Py_GetPath()`: Obtenga `sys.path` en su lugar.

  - `Py_GetPrefix()`: Get `sys.base_prefix` and `sys.prefix` instead.

  - `Py_GetProgramFullPath()`: Obtenga `sys.executable` en su lugar.

  - `Py_GetProgramName()`: Obtenga `sys.executable` en su lugar.

  - `Py_GetPythonHome()`: Obtenga la variable de entorno `PyConfig.home` o `PYTHONHOME` en su lugar.

### Pendiente de eliminación en futuras versiones

Las siguientes API están obsoletas y se eliminarán, aunque actualmente no hay una fecha programada para su eliminación.

- `Py_TPFLAGS_HAVE_FINALIZE`: Innecesario desde Python 3.8.

- `PyErr_Fetch()`: Utilice `PyErr_GetRaisedException()` en su lugar.

- `PyErr_NormalizeException()`: Utilice `PyErr_GetRaisedException()` en su lugar.

- `PyErr_Restore()`: Utilice `PyErr_SetRaisedException()` en su lugar.

- `PyModule_GetFilename()`: Utilice `PyModule_GetFilenameObject()` en su lugar.

- `PyOS_AfterFork()`: Utilice `PyOS_AfterFork_Child()` en su lugar.

- `PySlice_GetIndicesEx()`: Utilice `PySlice_Unpack()` y `PySlice_AdjustIndices()` en su lugar.

- `PyUnicode_AsDecodedObject()`: Utilice `PyCodec_Decode()` en su lugar.

- `PyUnicode_AsDecodedUnicode()`: Utilice `PyCodec_Decode()` en su lugar.

- `PyUnicode_AsEncodedObject()`: Utilice `PyCodec_Encode()` en su lugar.

- `PyUnicode_AsEncodedUnicode()`: Utilice `PyCodec_Encode()` en su lugar.

- `PyUnicode_READY()`: Innecesario desde Python 3.12

- `PyErr_Display()`: Utilice `PyErr_DisplayException()` en su lugar.

- `_PyErr_ChainExceptions()`: Utilice `_PyErr_ChainExceptions1()` en su lugar.

- Miembro de `PyBytesObject.ob_shash`: llame a `PyObject_Hash()` en su lugar.

- Miembro de `PyDictObject.ma_version_tag`.

- API de almacenamiento local de subprocesos (TLS):

  - `PyThread_create_key()`: Utilice `PyThread_tss_alloc()` en su lugar.

  - `PyThread_delete_key()`: Utilice `PyThread_tss_free()` en su lugar.

  - `PyThread_set_key_value()`: Utilice `PyThread_tss_set()` en su lugar.

  - `PyThread_get_key_value()`: Utilice `PyThread_tss_get()` en su lugar.

  - `PyThread_delete_key_value()`: Utilice `PyThread_tss_delete()` en su lugar.

  - `PyThread_ReInitTLS()`: Innecesario desde Python 3.7.