From fee956325cb2d44a283631470d36a769470f61f0 Mon Sep 17 00:00:00 2001 From: Cristian Maureira-Fredes Date: Fri, 26 Jun 2020 22:46:06 +0200 Subject: [PATCH 1/4] Traducido extending/newtypes_tutorial --- dict | 4 + extending/newtypes_tutorial.po | 444 ++++++++++++++++++++++++++++++--- 2 files changed, 419 insertions(+), 29 deletions(-) diff --git a/dict b/dict index 85287780a9..b905105a61 100644 --- a/dict +++ b/dict @@ -532,6 +532,7 @@ referenciarse regex reinicializador reinicializar +reimplementado remove renombramiento reordenar @@ -542,6 +543,7 @@ retrocompatible remuestreo request reubicar +reubicador root run s @@ -598,6 +600,8 @@ subinterprete subinterpretes submódulo submódulos +subobjetos +subobjeto subpaquete subpaquetes subproceso diff --git a/extending/newtypes_tutorial.po b/extending/newtypes_tutorial.po index 7d3af0c6fd..a24b4ce6f8 100644 --- a/extending/newtypes_tutorial.po +++ b/extending/newtypes_tutorial.po @@ -6,23 +6,25 @@ # Check https://github.com/PyCampES/python-docs-es/blob/3.8/TRANSLATORS to # get the list of volunteers # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: Python 3.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-05-05 12:54+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2020-06-26 22:37+0200\n" "Language-Team: python-doc-es\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.8.0\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Last-Translator: Cristián Maureira-Fredes \n" +"Language: es\n" +"X-Generator: Poedit 2.3\n" #: ../Doc/extending/newtypes_tutorial.rst:7 msgid "Defining Extension Types: Tutorial" -msgstr "" +msgstr "Definición de tipos de extensión: Tutorial" #: ../Doc/extending/newtypes_tutorial.rst:14 msgid "" @@ -32,10 +34,16 @@ msgid "" "pattern, but there are some details that you need to understand before you " "can get started. This document is a gentle introduction to the topic." msgstr "" +"Python le permite al escritor de un módulo de extensión C definir nuevos " +"tipos que pueden ser manipulados desde el código Python, al igual que los " +"tipos incorporados :class:`str` y :class:`list`. El código para todos los " +"tipos de extensión sigue un patrón, pero hay algunos detalles que debe " +"comprender antes de comenzar. Este documento es una introducción suave al " +"tema." #: ../Doc/extending/newtypes_tutorial.rst:24 msgid "The Basics" -msgstr "" +msgstr "Lo Básico" #: ../Doc/extending/newtypes_tutorial.rst:26 msgid "" @@ -48,12 +56,22 @@ msgid "" "an object, a method called, or it is multiplied by another object. These C " "functions are called \"type methods\"." msgstr "" +"El tiempo de ejecución :term:`CPython` ve todos los objetos de Python como " +"variables de tipo :c:type:`PyObject\\*`, que sirve como un \"tipo base\" " +"para todos los objetos de Python. La estructura :c:type:`PyObject` solo " +"contiene el :term:`reference count` del objeto y un puntero al \"objeto tipo" +"\" del objeto. Aquí es donde está la acción; el objeto tipo determina qué " +"funciones (C) llama el intérprete cuando, por ejemplo, se busca un atributo " +"en un objeto, se llama un método o se multiplica por otro objeto. Estas " +"funciones de C se denominan \"métodos de tipo\"." #: ../Doc/extending/newtypes_tutorial.rst:35 msgid "" "So, if you want to define a new extension type, you need to create a new " "type object." msgstr "" +"Por lo tanto, si desea definir un nuevo tipo de extensión, debe crear un " +"nuevo objeto de tipo." #: ../Doc/extending/newtypes_tutorial.rst:38 msgid "" @@ -61,6 +79,9 @@ msgid "" "but complete, module that defines a new type named :class:`Custom` inside a " "C extension module :mod:`custom`:" msgstr "" +"Este tipo de cosas solo se pueden explicar con un ejemplo, por lo que aquí " +"hay un módulo mínimo, pero completo, que define un nuevo tipo llamado :class:" +"`Custom` dentro de un módulo de extensión C :mod:`custom`:" #: ../Doc/extending/newtypes_tutorial.rst:43 msgid "" @@ -69,18 +90,29 @@ msgid "" "allows defining heap-allocated extension types using the :c:func:" "`PyType_FromSpec` function, which isn't covered in this tutorial." msgstr "" +"Lo que estamos mostrando aquí es la forma tradicional de definir tipos de " +"extensión *estáticos*. Debe ser adecuado para la mayoría de los usos. La API " +"de C también permite definir tipos de extensiones asignadas en el montón " +"utilizando la función :c:func:`PyType_FromSpec`, que no se trata en este " +"tutorial." #: ../Doc/extending/newtypes_tutorial.rst:50 msgid "" "Now that's quite a bit to take in at once, but hopefully bits will seem " "familiar from the previous chapter. This file defines three things:" msgstr "" +"Ahora, eso es bastante para asimilar a la vez, pero espero que los " +"fragmentos le resulten familiares en el capítulo anterior. Este archivo " +"define tres cosas:" #: ../Doc/extending/newtypes_tutorial.rst:53 msgid "" "What a :class:`Custom` **object** contains: this is the ``CustomObject`` " "struct, which is allocated once for each :class:`Custom` instance." msgstr "" +"Lo que contiene un **objeto** :class:`Custom`: esta es la estructura " +"``CustomObject``, que se asigna una vez para cada instancia de :class:" +"`Custom`." #: ../Doc/extending/newtypes_tutorial.rst:55 msgid "" @@ -88,16 +120,21 @@ msgid "" "which defines a set of flags and function pointers that the interpreter " "inspects when specific operations are requested." msgstr "" +"Cómo se comporta :class:`Custom` **type**: esta es la estructura " +"``CustomType``, que define un conjunto de indicadores y punteros de función " +"que el intérprete inspecciona cuando se solicitan operaciones específicas." #: ../Doc/extending/newtypes_tutorial.rst:58 msgid "" "How to initialize the :mod:`custom` module: this is the ``PyInit_custom`` " "function and the associated ``custommodule`` struct." msgstr "" +"Cómo inicializar el módulo :mod:`custom`: esta es la función " +"``PyInit_custom`` y la estructura asociada ``custommodule``." #: ../Doc/extending/newtypes_tutorial.rst:61 msgid "The first bit is::" -msgstr "" +msgstr "La primera parte es::" #: ../Doc/extending/newtypes_tutorial.rst:67 msgid "" @@ -108,12 +145,21 @@ msgid "" "and :c:macro:`Py_TYPE` respectively). The reason for the macro is to " "abstract away the layout and to enable additional fields in debug builds." msgstr "" +"Esto es lo que contendrá un objeto personalizado. ``PyObject_HEAD`` es " +"obligatorio al comienzo de cada estructura de objeto y define un campo " +"llamado ``ob_base`` de tipo :c:type:`PyObject`, que contiene un puntero a un " +"objeto de tipo y un recuento de referencia (estos pueden ser se accede " +"mediante las macros :c:macro:`Py_REFCNT` y :c:macro:`Py_TYPE` " +"respectivamente). El motivo de la macro es abstraer el diseño y habilitar " +"campos adicionales en las compilaciones de depuración." #: ../Doc/extending/newtypes_tutorial.rst:75 msgid "" "There is no semicolon above after the :c:macro:`PyObject_HEAD` macro. Be " "wary of adding one by accident: some compilers will complain." msgstr "" +"No hay punto y coma arriba después de la macro :c:macro:`PyObject_HEAD`. " +"Tenga cuidado de agregar uno por accidente: algunos compiladores se quejarán." #: ../Doc/extending/newtypes_tutorial.rst:78 msgid "" @@ -121,10 +167,13 @@ msgid "" "``PyObject_HEAD`` boilerplate; for example, here is the definition for " "standard Python floats::" msgstr "" +"Por supuesto, los objetos generalmente almacenan datos adicionales además " +"del estándar ``PyObject_HEAD`` repetitivo; por ejemplo, aquí está la " +"definición de flotadores Python estándar::" #: ../Doc/extending/newtypes_tutorial.rst:87 msgid "The second bit is the definition of the type object. ::" -msgstr "" +msgstr "El segundo bit es la definición del objeto tipo. ::" #: ../Doc/extending/newtypes_tutorial.rst:100 msgid "" @@ -132,6 +181,10 @@ msgid "" "listing all the :c:type:`PyTypeObject` fields that you don't care about and " "also to avoid caring about the fields' declaration order." msgstr "" +"Recomendamos utilizar los inicializadores designados al estilo C99 como se " +"indica arriba, para evitar enumerar todos los campos :c:type:`PyTypeObject` " +"que no le interesan y también para evitar preocuparse por el orden de " +"declaración de los campos." #: ../Doc/extending/newtypes_tutorial.rst:104 msgid "" @@ -140,22 +193,31 @@ msgid "" "fields will be filled with zeros by the C compiler, and it's common practice " "to not specify them explicitly unless you need them." msgstr "" +"La definición real de :c:type:`PyTypeObject` en :file:`object.h` tiene " +"muchos más :ref:`campos ` que la definición anterior. El " +"compilador de C rellenará los campos restantes con ceros, y es una práctica " +"común no especificarlos explícitamente a menos que los necesite." #: ../Doc/extending/newtypes_tutorial.rst:109 msgid "We're going to pick it apart, one field at a time::" -msgstr "" +msgstr "Lo vamos a separar, un campo a la vez:" #: ../Doc/extending/newtypes_tutorial.rst:113 msgid "" "This line is mandatory boilerplate to initialize the ``ob_base`` field " "mentioned above. ::" msgstr "" +"Esta línea es obligatoria para inicializar el campo ``ob_base`` mencionado " +"anteriormente. ::" #: ../Doc/extending/newtypes_tutorial.rst:118 msgid "" "The name of our type. This will appear in the default textual " "representation of our objects and in some error messages, for example:" msgstr "" +"El nombre de nuestro tipo. Esto aparecerá en la representación textual " +"predeterminada de nuestros objetos y en algunos mensajes de error, por " +"ejemplo:" #: ../Doc/extending/newtypes_tutorial.rst:128 msgid "" @@ -165,6 +227,12 @@ msgid "" "`custom.Custom`. Using the real dotted import path is important to make your " "type compatible with the :mod:`pydoc` and :mod:`pickle` modules. ::" msgstr "" +"Tenga en cuenta que el nombre es un nombre punteado que incluye tanto el " +"nombre del módulo como el nombre del tipo dentro del módulo. El módulo en " +"este caso es :mod:`custom` y el tipo es :class:`Custom`, por lo que " +"establecemos el nombre del tipo en :class:`custom.Custom`. Usar la ruta de " +"importación punteada real es importante para que su tipo sea compatible con " +"los módulos :mod:`pydoc` y :mod:`pickle`. ::" #: ../Doc/extending/newtypes_tutorial.rst:137 msgid "" @@ -172,6 +240,9 @@ msgid "" "class:`Custom` instances. :c:member:`~PyTypeObject.tp_itemsize` is only " "used for variable-sized objects and should otherwise be zero." msgstr "" +"Esto es para que Python sepa cuánta memoria asignar al crear instancias " +"nuevas :class:`Custom`. :c:member:`~PyTypeObject.tp_itemsize` solo se usa " +"para objetos de tamaño variable y, de lo contrario, debería ser cero." #: ../Doc/extending/newtypes_tutorial.rst:143 msgid "" @@ -186,10 +257,20 @@ msgid "" "type will be :class:`object`, or else you will be adding data members to " "your base type, and therefore increasing its size." msgstr "" +"Si desea que su tipo pueda tener subclases desde Python, y su tipo tiene el " +"mismo :c:member:`~PyTypeObject.tp_basicsize` como su tipo base, puede tener " +"problemas con la herencia múltiple. Una subclase de Python de su tipo tendrá " +"que enumerar su tipo primero en su :attr:`~class.__bases__`, o de lo " +"contrario no podrá llamar al método de su tipo :meth:`__new__` sin obtener " +"un error. Puede evitar este problema asegurándose de que su tipo tenga un " +"valor mayor para :c:member:`~PyTypeObject.tp_basicsize` que su tipo base. La " +"mayoría de las veces, esto será cierto de todos modos, porque su tipo base " +"será :class:`object`, o de lo contrario agregará miembros de datos a su tipo " +"base y, por lo tanto, aumentará su tamaño." #: ../Doc/extending/newtypes_tutorial.rst:153 msgid "We set the class flags to :const:`Py_TPFLAGS_DEFAULT`. ::" -msgstr "" +msgstr "Configuramos las banderas de clase a :const:`Py_TPFLAGS_DEFAULT`. ::" #: ../Doc/extending/newtypes_tutorial.rst:157 msgid "" @@ -197,11 +278,16 @@ msgid "" "the members defined until at least Python 3.3. If you need further members, " "you will need to OR the corresponding flags." msgstr "" +"Todos los tipos deben incluir esta constante en sus banderas. Habilita todos " +"los miembros definidos hasta al menos Python 3.3. Si necesita más miembros, " +"necesitará O (*OR*) las banderas correspondientes." #: ../Doc/extending/newtypes_tutorial.rst:161 msgid "" "We provide a doc string for the type in :c:member:`~PyTypeObject.tp_doc`. ::" msgstr "" +"Proporcionamos una cadena de documentos para el tipo en :c:member:" +"`~PyTypeObject.tp_doc`. ::" #: ../Doc/extending/newtypes_tutorial.rst:165 msgid "" @@ -211,12 +297,19 @@ msgid "" "use the default implementation provided by the API function :c:func:" "`PyType_GenericNew`. ::" msgstr "" +"Para habilitar la creación de objetos, debemos proporcionar un controlador :" +"c:member:`~PyTypeObject.tp_new`. Este es el equivalente del método Python :" +"meth:`__new__`, pero debe especificarse explícitamente. En este caso, " +"podemos usar la implementación predeterminada proporcionada por la función " +"API :c:func:`PyType_GenericNew`. ::" #: ../Doc/extending/newtypes_tutorial.rst:172 msgid "" "Everything else in the file should be familiar, except for some code in :c:" "func:`PyInit_custom`::" msgstr "" +"Todo lo demás en el archivo debe ser familiar, excepto algún código en :c:" +"func:`PyInit_custom`::" #: ../Doc/extending/newtypes_tutorial.rst:178 msgid "" @@ -224,22 +317,29 @@ msgid "" "the appropriate default values, including :attr:`ob_type` that we initially " "set to ``NULL``. ::" msgstr "" +"Esto inicializa el tipo :class:`Custom`, completando un número de miembros " +"con los valores predeterminados apropiados, que incluyen :attr:`ob_type` que " +"inicialmente configuramos en ``NULL``. ::" #: ../Doc/extending/newtypes_tutorial.rst:189 msgid "" "This adds the type to the module dictionary. This allows us to create :" "class:`Custom` instances by calling the :class:`Custom` class:" msgstr "" +"Esto agrega el tipo al diccionario del módulo. Esto nos permite crear " +"instancias :class:`Custom` llamando la clase :class:`Custom`:" #: ../Doc/extending/newtypes_tutorial.rst:197 msgid "" "That's it! All that remains is to build it; put the above code in a file " "called :file:`custom.c` and:" msgstr "" +"¡Eso es! Todo lo que queda es construirlo; ponga el código anterior en un " +"archivo llamado :file:`custom.c` y:" #: ../Doc/extending/newtypes_tutorial.rst:206 msgid "in a file called :file:`setup.py`; then typing" -msgstr "" +msgstr "en un archivo llamado :file:`setup.py`; luego escribiendo" #: ../Doc/extending/newtypes_tutorial.rst:212 msgid "" @@ -247,16 +347,21 @@ msgid "" "to that directory and fire up Python --- you should be able to ``import " "custom`` and play around with Custom objects." msgstr "" +"en un shell debería producir un archivo :file:`custom.so` en un " +"subdirectorio; muévete a ese directorio y abre Python --- deberías poder " +"``import custom`` y jugar con objetos personalizados." #: ../Doc/extending/newtypes_tutorial.rst:216 msgid "That wasn't so hard, was it?" -msgstr "" +msgstr "Eso no fue tan difícil, ¿verdad?" #: ../Doc/extending/newtypes_tutorial.rst:218 msgid "" "Of course, the current Custom type is pretty uninteresting. It has no data " "and doesn't do anything. It can't even be subclassed." msgstr "" +"Por supuesto, el tipo personalizado actual es bastante poco interesante. No " +"tiene datos y no hace nada. Ni siquiera se puede subclasificar." #: ../Doc/extending/newtypes_tutorial.rst:222 msgid "" @@ -267,10 +372,16 @@ msgid "" "Packaging User's Guide `_." msgstr "" +"Si bien esta documentación muestra el módulo estándar :mod:`distutils` para " +"construir extensiones C, se recomienda en casos de uso del mundo real " +"utilizar la biblioteca ``setuptools`` más nueva y mejor mantenida. La " +"documentación sobre cómo hacer esto está fuera del alcance de este documento " +"y se puede encontrar en la `Guía de usuario del Empaquetamiento de Python " +"`_." #: ../Doc/extending/newtypes_tutorial.rst:230 msgid "Adding data and methods to the Basic example" -msgstr "" +msgstr "Agregar datos y métodos al ejemplo básico" #: ../Doc/extending/newtypes_tutorial.rst:232 msgid "" @@ -278,20 +389,25 @@ msgid "" "make the type usable as a base class. We'll create a new module, :mod:" "`custom2` that adds these capabilities:" msgstr "" +"Extendamos el ejemplo básico para agregar algunos datos y métodos. También " +"hagamos que el tipo sea utilizable como una clase base. Crearemos un nuevo " +"módulo, :mod:`custom2` que agrega estas capacidades:" #: ../Doc/extending/newtypes_tutorial.rst:239 msgid "This version of the module has a number of changes." -msgstr "" +msgstr "Esta versión del módulo tiene una serie de cambios." #: ../Doc/extending/newtypes_tutorial.rst:241 msgid "We've added an extra include::" -msgstr "" +msgstr "Hemos agregado una inclusión adicional::" #: ../Doc/extending/newtypes_tutorial.rst:245 msgid "" "This include provides declarations that we use to handle attributes, as " "described a bit later." msgstr "" +"Esto incluye declaraciones que usamos para manejar atributos, como se " +"describe un poco más adelante." #: ../Doc/extending/newtypes_tutorial.rst:248 msgid "" @@ -300,20 +416,27 @@ msgid "" "strings containing first and last names. The *number* attribute is a C " "integer." msgstr "" +"El tipo :class:`Custom` ahora tiene tres atributos de datos en su estructura " +"C, *first*, *last* y *number*. Las variables *first* y *last* son cadenas de " +"caracteres de Python que contienen nombres y apellidos. El atributo *number* " +"es un entero C." #: ../Doc/extending/newtypes_tutorial.rst:252 msgid "The object structure is updated accordingly::" -msgstr "" +msgstr "La estructura del objeto se actualiza en consecuencia::" #: ../Doc/extending/newtypes_tutorial.rst:261 msgid "" "Because we now have data to manage, we have to be more careful about object " "allocation and deallocation. At a minimum, we need a deallocation method::" msgstr "" +"Debido a que ahora tenemos datos para administrar, debemos ser más " +"cuidadosos con la asignación de objetos y la desasignación. Como mínimo, " +"necesitamos un método de desasignación::" #: ../Doc/extending/newtypes_tutorial.rst:272 msgid "which is assigned to the :c:member:`~PyTypeObject.tp_dealloc` member::" -msgstr "" +msgstr "que se asigna al miembro :c:member:`~PyTypeObject.tp_dealloc`::" #: ../Doc/extending/newtypes_tutorial.rst:276 msgid "" @@ -325,6 +448,13 @@ msgid "" "object's type might not be :class:`CustomType`, because the object may be an " "instance of a subclass." msgstr "" +"Este método primero borra los recuentos de referencia de los dos atributos " +"de Python. :c:func:`Py_XDECREF` maneja correctamente el caso donde su " +"argumento es ``NULL`` (lo que podría ocurrir aquí si ``tp_new`` fallara a " +"mitad de camino). Luego llama al miembro :c:member:`~PyTypeObject.tp_free` " +"del tipo de objeto (calculado por ``Py_TYPE(self)``) para liberar la memoria " +"del objeto. Tenga en cuenta que el tipo de objeto podría no ser :class:" +"`CustomType`, porque el objeto puede ser una instancia de una subclase." #: ../Doc/extending/newtypes_tutorial.rst:285 msgid "" @@ -334,16 +464,24 @@ msgid "" "argument. Otherwise, the compiler will emit a warning. This is object-" "oriented polymorphism, in C!" msgstr "" +"La conversión explícita a ``destructor`` anterior es necesaria porque " +"definimos ``Custom_dealloc`` para tomar un argumento ``CustomObject *``, " +"pero el puntero de función ``tp_dealloc`` espera recibir un argumento " +"``PyObject *``. De lo contrario, el compilador emitirá una advertencia. Este " +"es un polimorfismo orientado a objetos, en C!" #: ../Doc/extending/newtypes_tutorial.rst:291 msgid "" "We want to make sure that the first and last names are initialized to empty " "strings, so we provide a ``tp_new`` implementation::" msgstr "" +"Queremos asegurarnos de que el nombre y el apellido se inicialicen en " +"cadenas de caracteres vacías, por lo que proporcionamos una implementación " +"``tp_new``::" #: ../Doc/extending/newtypes_tutorial.rst:315 msgid "and install it in the :c:member:`~PyTypeObject.tp_new` member::" -msgstr "" +msgstr "e instalarlo en el miembro :c:member:`~PyTypeObject.tp_new`::" #: ../Doc/extending/newtypes_tutorial.rst:319 msgid "" @@ -355,6 +493,13 @@ msgid "" "use the ``tp_new`` handler to initialize the ``first`` and ``last`` " "attributes to non-``NULL`` default values." msgstr "" +"El controlador ``tp_new`` es responsable de crear (en lugar de inicializar) " +"objetos del tipo. Está expuesto en Python como el método :meth:`__new__`. No " +"es necesario definir un miembro ``tp_new``, y de hecho muchos tipos de " +"extensiones simplemente reutilizarán :c:func:`PyType_GenericNew` como se " +"hizo en la primera versión del tipo ``Personalizado`` anterior. En este " +"caso, usamos el controlador ``tp_new`` para inicializar los atributos " +"``first`` y ``last`` a valores predeterminados que no sean ``NULL``." #: ../Doc/extending/newtypes_tutorial.rst:327 msgid "" @@ -365,24 +510,37 @@ msgid "" "often ignore the arguments, leaving the argument handling to initializer (a." "k.a. ``tp_init`` in C or ``__init__`` in Python) methods." msgstr "" +"``tp_new`` se pasa el tipo que se instancia (no necesariamente " +"``CustomType``, si se instancia una subclase) y cualquier argumento pasado " +"cuando se llamó al tipo, y se espera que devuelva la instancia creada. Los " +"manejadores ``tp_new`` siempre aceptan argumentos posicionales y de palabras " +"clave, pero a menudo ignoran los argumentos, dejando el manejo de argumentos " +"al inicializador (también conocido como, ``tp_init`` en C o ``__init__`` en " +"Python)." #: ../Doc/extending/newtypes_tutorial.rst:335 msgid "" "``tp_new`` shouldn't call ``tp_init`` explicitly, as the interpreter will do " "it itself." msgstr "" +"``tp_new`` no debería llamar explícitamente a ``tp_init``, ya que el " +"intérprete lo hará por sí mismo." #: ../Doc/extending/newtypes_tutorial.rst:338 msgid "" "The ``tp_new`` implementation calls the :c:member:`~PyTypeObject.tp_alloc` " "slot to allocate memory::" msgstr "" +"La implementación ``tp_new`` llama al :c:member:`~PyTypeObject.tp_alloc` " +"para asignar memoria::" #: ../Doc/extending/newtypes_tutorial.rst:343 msgid "" "Since memory allocation may fail, we must check the :c:member:`~PyTypeObject." "tp_alloc` result against ``NULL`` before proceeding." msgstr "" +"Como la asignación de memoria puede fallar, debemos verificar el resultado :" +"c:member:`~PyTypeObject.tp_alloc` contra ``NULL`` antes de continuar." #: ../Doc/extending/newtypes_tutorial.rst:347 msgid "" @@ -391,6 +549,10 @@ msgid "" "class, which is :class:`object` by default. Most types use the default " "allocation strategy." msgstr "" +"No llenamos la ranura :c:member:`~PyTypeObject.tp_alloc` nosotros mismos. " +"Más bien :c:func:`PyType_Ready` lo llena para nosotros al heredarlo de " +"nuestra clase base, que es :class:`object` por defecto. La mayoría de los " +"tipos utilizan la estrategia de asignación predeterminada." #: ../Doc/extending/newtypes_tutorial.rst:353 msgid "" @@ -404,16 +566,28 @@ msgid "" "correctly. (Specifically, you may not be able to create instances of such " "subclasses without getting a :exc:`TypeError`.)" msgstr "" +"Si está creando una cooperativa :c:member:`~PyTypeObject.tp_new` (una que " +"llama a un tipo base :c:member:`~PyTypeObject.tp_new` o :meth:`__new__`), " +"*no* debe intentar determinar a qué método llamar utilizando el orden de " +"resolución del método en tiempo de ejecución. Siempre determine " +"estáticamente a qué tipo va a llamar, y llame a su :c:member:`~PyTypeObject." +"tp_new` directamente, o mediante ``type->tp_base->tp_new``. Si no hace esto, " +"las subclases de Python de su tipo que también heredan de otras clases " +"definidas por Python pueden no funcionar correctamente. (Específicamente, es " +"posible que no pueda crear instancias de tales subclases sin obtener un :exc:" +"`TypeError`)." #: ../Doc/extending/newtypes_tutorial.rst:363 msgid "" "We also define an initialization function which accepts arguments to provide " "initial values for our instance::" msgstr "" +"También definimos una función de inicialización que acepta argumentos para " +"proporcionar valores iniciales para nuestra instancia::" #: ../Doc/extending/newtypes_tutorial.rst:392 msgid "by filling the :c:member:`~PyTypeObject.tp_init` slot. ::" -msgstr "" +msgstr "rellenando la ranura :c:member:`~PyTypeObject.tp_init`. ::" #: ../Doc/extending/newtypes_tutorial.rst:396 msgid "" @@ -422,6 +596,11 @@ msgid "" "Initializers always accept positional and keyword arguments, and they should " "return either ``0`` on success or ``-1`` on error." msgstr "" +"La ranura :c:member:`~PyTypeObject.tp_init` está expuesta en Python como el " +"método :meth:`__init__`. Se utiliza para inicializar un objeto una vez " +"creado. Los inicializadores siempre aceptan argumentos posicionales y de " +"palabras clave, y deben devolver ``0`` en caso de éxito o ``-1`` en caso de " +"error." #: ../Doc/extending/newtypes_tutorial.rst:401 msgid "" @@ -433,6 +612,13 @@ msgid "" "new attribute values. We might be tempted, for example to assign the " "``first`` member like this::" msgstr "" +"A diferencia del controlador ``tp_new``, no hay garantía de que se llame a " +"``tp_init`` (por ejemplo, el módulo :mod:`pickle` por defecto no llama a :" +"meth:`__init__` en instancias no controladas ) También se puede llamar " +"varias veces. Cualquiera puede llamar al método :meth:`__init__` en nuestros " +"objetos. Por esta razón, debemos tener mucho cuidado al asignar los nuevos " +"valores de atributo. Podríamos sentirnos tentados, por ejemplo, a asignar el " +"``primer`` miembro de esta manera:" #: ../Doc/extending/newtypes_tutorial.rst:415 msgid "" @@ -443,6 +629,12 @@ msgid "" "interpreter Lock` and let arbitrary code run in other threads that accesses " "and modifies our object." msgstr "" +"Pero esto sería arriesgado. Nuestro tipo no restringe el tipo del ``primer`` " +"miembro, por lo que podría ser cualquier tipo de objeto. Podría tener un " +"destructor que haga que se ejecute código que intente acceder al miembro " +"``primer``; o ese destructor podría liberar el :term:`Global Interpreter " +"Lock` y permite que se ejecute código arbitrario en otros hilos que acceden " +"y modifican nuestro objeto." #: ../Doc/extending/newtypes_tutorial.rst:422 msgid "" @@ -450,16 +642,22 @@ msgid "" "always reassign members before decrementing their reference counts. When " "don't we have to do this?" msgstr "" +"Para ser paranoicos y protegernos de esta posibilidad, casi siempre " +"reasignamos miembros antes de disminuir sus recuentos de referencias. " +"¿Cuándo no tenemos que hacer esto?" #: ../Doc/extending/newtypes_tutorial.rst:426 msgid "when we absolutely know that the reference count is greater than 1;" msgstr "" +"cuando sabemos absolutamente que el recuento de referencia es mayor que 1;" #: ../Doc/extending/newtypes_tutorial.rst:428 msgid "" "when we know that deallocation of the object [#]_ will neither release the :" "term:`GIL` nor cause any calls back into our type's code;" msgstr "" +"cuando sabemos que la desasignación del objeto [#]_ no liberará el :term:" +"`GIL` ni causará ninguna llamada al código de nuestro tipo;" #: ../Doc/extending/newtypes_tutorial.rst:431 msgid "" @@ -467,17 +665,23 @@ msgid "" "tp_dealloc` handler on a type which doesn't support cyclic garbage " "collection [#]_." msgstr "" +"al disminuir un recuento de referencias en un manejador :c:member:" +"`~PyTypeObject.tp_dealloc` en un tipo que no admite la recolección de basura " +"cíclica [#]_." #: ../Doc/extending/newtypes_tutorial.rst:434 msgid "" "We want to expose our instance variables as attributes. There are a number " "of ways to do that. The simplest way is to define member definitions::" msgstr "" +"Queremos exponer nuestras variables de instancia como atributos. Hay varias " +"formas de hacerlo. La forma más simple es definir definiciones de miembros::" #: ../Doc/extending/newtypes_tutorial.rst:447 msgid "" "and put the definitions in the :c:member:`~PyTypeObject.tp_members` slot::" msgstr "" +"y poner las definiciones en la ranura :c:member:`~PyTypeObject.tp_members`::" #: ../Doc/extending/newtypes_tutorial.rst:451 msgid "" @@ -485,6 +689,10 @@ msgid "" "documentation string. See the :ref:`Generic-Attribute-Management` section " "below for details." msgstr "" +"Cada definición de miembro tiene un nombre de miembro, tipo, desplazamiento, " +"banderas de acceso y cadena de caracteres de documentación. Consulte la " +"sección :ref:`Generic-Attribute-Management` a continuación para obtener más " +"detalles." #: ../Doc/extending/newtypes_tutorial.rst:455 msgid "" @@ -496,12 +704,21 @@ msgid "" "``NULL`` values, the members can be set to ``NULL`` if the attributes are " "deleted." msgstr "" +"Una desventaja de este enfoque es que no proporciona una forma de restringir " +"los tipos de objetos que se pueden asignar a los atributos de Python. " +"Esperamos que el nombre y el apellido sean cadenas, pero se pueden asignar " +"objetos de Python. Además, los atributos se pueden eliminar, configurando " +"los punteros C en ``NULL``. Si bien podemos asegurarnos de que los miembros " +"se inicialicen en valores que no sean ``NULL``, los miembros se pueden " +"establecer en ``NULL`` si se eliminan los atributos." #: ../Doc/extending/newtypes_tutorial.rst:462 msgid "" "We define a single method, :meth:`Custom.name()`, that outputs the objects " "name as the concatenation of the first and last names. ::" msgstr "" +"Definimos un método único, :meth:`Custom.name()`, que genera el nombre de " +"los objetos como la concatenación de los nombres y apellidos. ::" #: ../Doc/extending/newtypes_tutorial.rst:479 msgid "" @@ -512,6 +729,13 @@ msgid "" "to accept a positional argument tuple or keyword argument dictionary. This " "method is equivalent to the Python method:" msgstr "" +"El método se implementa como una función C que toma una instancia de :class:" +"`Custom` (o subclase :class:`Custom`) como primer argumento. Los métodos " +"siempre toman una instancia como primer argumento. Los métodos a menudo " +"también toman argumentos posicionales y de palabras clave, pero en este caso " +"no tomamos ninguno y no necesitamos aceptar una tupla de argumentos " +"posicionales o un diccionario de argumentos de palabras clave. Este método " +"es equivalente al método Python:" #: ../Doc/extending/newtypes_tutorial.rst:491 msgid "" @@ -521,22 +745,32 @@ msgid "" "of these attributes and to restrict the attribute values to be strings. " "We'll see how to do that in the next section." msgstr "" +"Tenga en cuenta que tenemos que verificar la posibilidad de que nuestros " +"miembros :attr:`first` y :attr:`last` sean ``NULL``. Esto se debe a que se " +"pueden eliminar, en cuyo caso se establecen en ``NULL``. Sería mejor evitar " +"la eliminación de estos atributos y restringir los valores de los atributos " +"para que sean cadenas de caracteres. Veremos cómo hacerlo en la siguiente " +"sección." #: ../Doc/extending/newtypes_tutorial.rst:497 msgid "" "Now that we've defined the method, we need to create an array of method " "definitions::" msgstr "" +"Ahora que hemos definido el método, necesitamos crear un arreglo de " +"definiciones de métodos::" #: ../Doc/extending/newtypes_tutorial.rst:507 msgid "" "(note that we used the :const:`METH_NOARGS` flag to indicate that the method " "is expecting no arguments other than *self*)" msgstr "" +"(tenga en cuenta que usamos el indicador :const:`METH_NOARGS` para indicar " +"que el método no espera argumentos distintos de *self*)" #: ../Doc/extending/newtypes_tutorial.rst:510 msgid "and assign it to the :c:member:`~PyTypeObject.tp_methods` slot::" -msgstr "" +msgstr "y asignarlo a la ranura :c:member:`~PyTypeObject.tp_methods`::" #: ../Doc/extending/newtypes_tutorial.rst:514 msgid "" @@ -545,6 +779,11 @@ msgid "" "about the type of the object being created or used, so all we need to do is " "to add the :const:`Py_TPFLAGS_BASETYPE` to our class flag definition::" msgstr "" +"Finalmente, haremos que nuestro tipo sea utilizable como una clase base para " +"la subclase. Hemos escrito nuestros métodos cuidadosamente hasta ahora para " +"que no hagan suposiciones sobre el tipo de objeto que se está creando o " +"utilizando, por lo que todo lo que tenemos que hacer es agregar :const:" +"`Py_TPFLAGS_BASETYPE` a nuestra definición de bandera de clase::" #: ../Doc/extending/newtypes_tutorial.rst:521 msgid "" @@ -552,14 +791,20 @@ msgid "" "module name in the :c:type:`PyModuleDef` struct, and update the full class " "name in the :c:type:`PyTypeObject` struct." msgstr "" +"Cambiamos el nombre de :c:func:`PyInit_custom` a :c:func:`PyInit_custom2`, " +"actualizamos el nombre del módulo en la estructura :c:type:`PyModuleDef` y " +"actualizamos el nombre completo de la clase en la estructura :c:type:" +"`PyTypeObject`." #: ../Doc/extending/newtypes_tutorial.rst:525 msgid "Finally, we update our :file:`setup.py` file to build the new module:" msgstr "" +"Finalmente, actualizamos nuestro archivo :file:`setup.py` para construir el " +"nuevo módulo:" #: ../Doc/extending/newtypes_tutorial.rst:538 msgid "Providing finer control over data attributes" -msgstr "" +msgstr "Proporcionar un control más preciso sobre los atributos de datos" #: ../Doc/extending/newtypes_tutorial.rst:540 msgid "" @@ -569,6 +814,12 @@ msgid "" "attr:`last` could be set to non-string values or even deleted. We want to " "make sure that these attributes always contain strings." msgstr "" +"En esta sección, proporcionaremos un control más preciso sobre cómo se " +"establecen los atributos :attr:`first` y :attr:`last` en el ejemplo :class:" +"`Custom`. En la versión anterior de nuestro módulo, las variables de " +"instancia :attr:`first` y :attr:`last` podrían establecerse en valores que " +"no sean de cadena o incluso eliminarse. Queremos asegurarnos de que estos " +"atributos siempre contengan cadenas." #: ../Doc/extending/newtypes_tutorial.rst:549 msgid "" @@ -576,6 +827,9 @@ msgid "" "attributes, we'll use custom getter and setter functions. Here are the " "functions for getting and setting the :attr:`first` attribute::" msgstr "" +"Para proporcionar un mayor control sobre los atributos :attr:`first` y :attr:" +"`last`, usaremos funciones personalizadas *getter* y *setter*. Estas son las " +"funciones para obtener y configurar el atributo :attr:`first`::" #: ../Doc/extending/newtypes_tutorial.rst:580 msgid "" @@ -586,6 +840,12 @@ msgid "" "getter and setter functions that decide the attribute to get or set based on " "data in the closure.)" msgstr "" +"La función *getter* se pasa al objeto :class:`Custom` y un \"cierre" +"\" (*closure*), que es un puntero nulo. En este caso, se ignora el cierre. " +"(El cierre admite un uso avanzado en el que los datos de definición se pasan " +"al captador y al definidor. Esto podría, por ejemplo, usarse para permitir " +"un solo conjunto de funciones de captador y definidor que deciden que el " +"atributo se obtenga o establezca en función de los datos en el cierre.)" #: ../Doc/extending/newtypes_tutorial.rst:586 msgid "" @@ -594,14 +854,18 @@ msgid "" "being deleted. In our setter, we raise an error if the attribute is deleted " "or if its new value is not a string." msgstr "" +"La función *setter* pasa el objeto :class:`Custom`, el nuevo valor y el " +"cierre. El nuevo valor puede ser ``NULL``, en cuyo caso se está eliminando " +"el atributo. En nuestro *setter*, generamos un error si el atributo se " +"elimina o si su nuevo valor no es una cadena." #: ../Doc/extending/newtypes_tutorial.rst:591 msgid "We create an array of :c:type:`PyGetSetDef` structures::" -msgstr "" +msgstr "Creamos un arreglo de estructuras :c:type:`PyGetSetDef`::" #: ../Doc/extending/newtypes_tutorial.rst:601 msgid "and register it in the :c:member:`~PyTypeObject.tp_getset` slot::" -msgstr "" +msgstr "y lo registra en la ranura :c:member:`~PyTypeObject.tp_getset`::" #: ../Doc/extending/newtypes_tutorial.rst:605 msgid "" @@ -609,16 +873,21 @@ msgid "" "mentioned above. In this case, we aren't using a closure, so we just pass " "``NULL``." msgstr "" +"El último elemento en la estructura :c:type:`PyGetSetDef` es el \"cierre" +"\" (*closure*) mencionado anteriormente. En este caso, no estamos usando un " +"cierre, por lo que simplemente pasamos ``NULL``." #: ../Doc/extending/newtypes_tutorial.rst:608 msgid "We also remove the member definitions for these attributes::" -msgstr "" +msgstr "También eliminamos las definiciones de miembro para estos atributos::" #: ../Doc/extending/newtypes_tutorial.rst:616 msgid "" "We also need to update the :c:member:`~PyTypeObject.tp_init` handler to only " "allow strings [#]_ to be passed::" msgstr "" +"También necesitamos actualizar el manejador :c:member:`~PyTypeObject." +"tp_init` para permitir que solo se pasen las cadenas [#]_::" #: ../Doc/extending/newtypes_tutorial.rst:645 msgid "" @@ -629,6 +898,14 @@ msgid "" "these calls is in the ``tp_dealloc`` implementation, where there is the " "possibility that the initialization of these members failed in ``tp_new``." msgstr "" +"Con estos cambios, podemos asegurar que los miembros ``primero`` y " +"``último`` nunca sean ``NULL``, por lo que podemos eliminar las " +"comprobaciones de los valores ``NULL`` en casi todos los casos. Esto " +"significa que la mayoría de las llamadas :c:func:`Py_XDECREF` se pueden " +"convertir en llamadas :c:func:`Py_DECREF`. El único lugar donde no podemos " +"cambiar estas llamadas es en la implementación ``tp_dealloc``, donde existe " +"la posibilidad de que la inicialización de estos miembros falle en " +"``tp_new``." #: ../Doc/extending/newtypes_tutorial.rst:652 msgid "" @@ -636,10 +913,13 @@ msgid "" "initialization function, as we did before, and we add an extra definition to " "the :file:`setup.py` file." msgstr "" +"También cambiamos el nombre de la función de inicialización del módulo y el " +"nombre del módulo en la función de inicialización, como lo hicimos antes, y " +"agregamos una definición adicional al archivo :file:`setup.py`." #: ../Doc/extending/newtypes_tutorial.rst:658 msgid "Supporting cyclic garbage collection" -msgstr "" +msgstr "Apoyo a la recolección de basura cíclica" #: ../Doc/extending/newtypes_tutorial.rst:660 msgid "" @@ -647,6 +927,10 @@ msgid "" "can identify unneeded objects even when their reference counts are not zero. " "This can happen when objects are involved in cycles. For example, consider:" msgstr "" +"Python tiene un :term:`recolector de basura cíclico (GC) ` que puede identificar objetos innecesarios incluso cuando sus " +"recuentos de referencia no son cero. Esto puede suceder cuando los objetos " +"están involucrados en ciclos. Por ejemplo, considere:" #: ../Doc/extending/newtypes_tutorial.rst:670 msgid "" @@ -655,6 +939,10 @@ msgid "" "zero. Fortunately, Python's cyclic garbage collector will eventually figure " "out that the list is garbage and free it." msgstr "" +"En este ejemplo, creamos una lista que se contiene a sí misma. Cuando lo " +"eliminamos, todavía tiene una referencia de sí mismo. Su recuento de " +"referencia no cae a cero. Afortunadamente, el recolector cíclico de basura " +"de Python finalmente descubrirá que la lista es basura y la liberará." #: ../Doc/extending/newtypes_tutorial.rst:675 msgid "" @@ -664,6 +952,12 @@ msgid "" "`Custom`, and subclasses may add arbitrary attributes. For any of those two " "reasons, :class:`Custom` objects can participate in cycles:" msgstr "" +"En la segunda versión del ejemplo :class:`Custom`, permitimos que cualquier " +"tipo de objeto se almacene en :attr:`first` o :attr:`last` atributos [#]_. " +"Además, en la segunda y tercera versión, permitimos subclases :class:" +"`Custom`, y las subclases pueden agregar atributos arbitrarios. Por " +"cualquiera de esos dos motivos, los objetos :class:`Custom` pueden " +"participar en ciclos:" #: ../Doc/extending/newtypes_tutorial.rst:689 msgid "" @@ -672,12 +966,18 @@ msgid "" "needs to fill two additional slots and to enable a flag that enables these " "slots:" msgstr "" +"Para permitir que una instancia de :class:`Custom` que participa en un ciclo " +"de referencia sea detectada y recolectada correctamente por el GC cíclico, " +"nuestro tipo :class:`Custom` necesita llenar dos espacios adicionales y " +"habilitar un indicador que permita estos espacios:" #: ../Doc/extending/newtypes_tutorial.rst:696 msgid "" "First, the traversal method lets the cyclic GC know about subobjects that " "could participate in cycles::" msgstr "" +"Primero, el método transversal permite que el GC cíclico conozca los " +"subobjetos que podrían participar en los ciclos::" #: ../Doc/extending/newtypes_tutorial.rst:716 msgid "" @@ -687,6 +987,11 @@ msgid "" "*arg* passed to the traversal method. It returns an integer value that must " "be returned if it is non-zero." msgstr "" +"Para cada subobjeto que puede participar en ciclos, necesitamos llamar a la " +"función :c:func:`visit`, que se pasa al método transversal. La función :c:" +"func:`visit` toma como argumentos el subobjeto y el argumento extra *arg* " +"pasados al método transversal. Devuelve un valor entero que debe devolverse " +"si no es cero." #: ../Doc/extending/newtypes_tutorial.rst:722 msgid "" @@ -694,18 +999,25 @@ msgid "" "functions. With :c:func:`Py_VISIT`, we can minimize the amount of " "boilerplate in ``Custom_traverse``::" msgstr "" +"Python proporciona una macro :c:func:`Py_VISIT` que automatiza las funciones " +"de visita de llamada. Con :c:func:`Py_VISIT`, podemos minimizar la cantidad " +"de repeticiones en ``Custom_traverse``::" #: ../Doc/extending/newtypes_tutorial.rst:735 msgid "" "The :c:member:`~PyTypeObject.tp_traverse` implementation must name its " "arguments exactly *visit* and *arg* in order to use :c:func:`Py_VISIT`." msgstr "" +"La implementación :c:member:`~PyTypeObject.tp_traverse` debe nombrar sus " +"argumentos exactamente *visit* y *arg* para usar :c:func:`Py_VISIT`." #: ../Doc/extending/newtypes_tutorial.rst:738 msgid "" "Second, we need to provide a method for clearing any subobjects that can " "participate in cycles::" msgstr "" +"En segundo lugar, debemos proporcionar un método para borrar cualquier " +"subobjeto que pueda participar en los ciclos::" #: ../Doc/extending/newtypes_tutorial.rst:749 msgid "" @@ -716,10 +1028,17 @@ msgid "" "attribute's destructor would call back into code that reads the attribute " "again (*especially* if there is a reference cycle)." msgstr "" +"Observe el uso de la macro :c:func:`Py_CLEAR`. Es la forma recomendada y " +"segura de borrar los atributos de datos de tipos arbitrarios al tiempo que " +"disminuye sus recuentos de referencia. Si tuviera que llamar a :c:func:" +"`Py_XDECREF` en lugar del atributo antes de establecerlo en ``NULL``, existe " +"la posibilidad de que el destructor del atributo vuelva a llamar al código " +"que lee el atributo nuevamente (*especialmente* si hay un ciclo de " +"referencia)." #: ../Doc/extending/newtypes_tutorial.rst:757 msgid "You could emulate :c:func:`Py_CLEAR` by writing::" -msgstr "" +msgstr "Puede emular :c:func:`Py_CLEAR` escribiendo::" #: ../Doc/extending/newtypes_tutorial.rst:764 msgid "" @@ -727,6 +1046,9 @@ msgid "" "`Py_CLEAR` when deleting an attribute. Don't try to micro-optimize at the " "expense of robustness!" msgstr "" +"Sin embargo, es mucho más fácil y menos propenso a errores usar siempre :c:" +"func:`Py_CLEAR` al eliminar un atributo. ¡No intentes micro-optimizar a " +"expensas de la robustez!" #: ../Doc/extending/newtypes_tutorial.rst:768 msgid "" @@ -737,11 +1059,20 @@ msgid "" "members. Here is our reimplemented deallocator using :c:func:" "`PyObject_GC_UnTrack` and ``Custom_clear``::" msgstr "" +"El desasignador ``Custom_dealloc`` puede llamar a un código arbitrario al " +"borrar los atributos. Significa que el GC circular se puede activar dentro " +"de la función. Dado que el GC asume que el recuento de referencias no es " +"cero, debemos destrabar el objeto del GC llamando a :c:func:" +"`PyObject_GC_UnTrack` antes de borrar los miembros. Aquí está nuestro " +"reubicador reimplementado usando :c:func:`PyObject_GC_UnTrack` y " +"``Custom_clear``::" #: ../Doc/extending/newtypes_tutorial.rst:783 msgid "" "Finally, we add the :const:`Py_TPFLAGS_HAVE_GC` flag to the class flags::" msgstr "" +"Finalmente, agregamos el indicador :const:`Py_TPFLAGS_HAVE_GC` a los " +"indicadores de clase::" #: ../Doc/extending/newtypes_tutorial.rst:787 msgid "" @@ -750,10 +1081,15 @@ msgid "" "them for cyclic garbage collection. Most extensions will use the versions " "automatically provided." msgstr "" +"Eso es prácticamente todo. Si hubiéramos escrito controladores " +"personalizados :c:member:`~PyTypeObject.tp_alloc` o :c:member:`~PyTypeObject." +"tp_free`, tendríamos que modificarlos para la recolección de basura cíclica. " +"La mayoría de las extensiones usarán las versiones proporcionadas " +"automáticamente." #: ../Doc/extending/newtypes_tutorial.rst:793 msgid "Subclassing other types" -msgstr "" +msgstr "Subclases de otros tipos" #: ../Doc/extending/newtypes_tutorial.rst:795 msgid "" @@ -762,6 +1098,11 @@ msgid "" "can easily use the :c:type:`PyTypeObject` it needs. It can be difficult to " "share these :c:type:`PyTypeObject` structures between extension modules." msgstr "" +"Es posible crear nuevos tipos de extensión que se derivan de los tipos " +"existentes. Es más fácil heredar de los tipos incorporados, ya que una " +"extensión puede usar fácilmente :c:type:`PyTypeObject` que necesita. Puede " +"ser difícil compartir estas estructuras :c:type:`PyTypeObject` entre módulos " +"de extensión." #: ../Doc/extending/newtypes_tutorial.rst:800 msgid "" @@ -770,6 +1111,10 @@ msgid "" "with regular lists, but will have an additional :meth:`increment` method " "that increases an internal counter:" msgstr "" +"En este ejemplo crearemos un tipo :class:`SubList` que hereda del tipo " +"incorporado :class:`list`. El nuevo tipo será completamente compatible con " +"las listas regulares, pero tendrá un método adicional :meth:`increment` que " +"aumenta un contador interno:" #: ../Doc/extending/newtypes_tutorial.rst:820 msgid "" @@ -777,6 +1122,9 @@ msgid "" "examples in previous sections. We will break down the main differences " "between them. ::" msgstr "" +"Como puede ver, el código fuente se parece mucho a los ejemplos :class:" +"`Custom` en secciones anteriores. Desglosaremos las principales diferencias " +"entre ellos. ::" #: ../Doc/extending/newtypes_tutorial.rst:828 msgid "" @@ -784,6 +1132,9 @@ msgid "" "object structure must be the first value. The base type will already " "include the :c:func:`PyObject_HEAD` at the beginning of its structure." msgstr "" +"La diferencia principal para los objetos de tipo derivado es que la " +"estructura de objeto del tipo base debe ser el primer valor. El tipo base ya " +"incluirá :c:func:`PyObject_HEAD` al comienzo de su estructura." #: ../Doc/extending/newtypes_tutorial.rst:832 msgid "" @@ -791,12 +1142,15 @@ msgid "" "pointer can be safely cast to both ``PyListObject *`` and ``SubListObject " "*``::" msgstr "" +"Cuando un objeto Python es una instancia de :class:`SubList`, su puntero " +"``PyObject *`` se puede convertir de forma segura tanto en ``PyListObject " +"*`` como en ``SubListObject *``::" #: ../Doc/extending/newtypes_tutorial.rst:844 msgid "" "We see above how to call through to the :attr:`__init__` method of the base " "type." -msgstr "" +msgstr "Vemos arriba cómo llamar al método :attr:`__init__` del tipo base." #: ../Doc/extending/newtypes_tutorial.rst:847 msgid "" @@ -806,6 +1160,12 @@ msgid "" "memory for the object with its :c:member:`~PyTypeObject.tp_alloc`, but let " "the base class handle it by calling its own :c:member:`~PyTypeObject.tp_new`." msgstr "" +"Este patrón es importante cuando se escribe un tipo con miembros " +"personalizados :c:member:`~PyTypeObject.tp_new` y :c:member:`~PyTypeObject." +"tp_dealloc`. El manejador :c:member:`~PyTypeObject.tp_new` no debería crear " +"realmente la memoria para el objeto con su :c:member:`~PyTypeObject." +"tp_alloc`, pero deja que la clase base lo maneje llamando a su propio :c:" +"member:`~PyTypeObject.tp_new`." #: ../Doc/extending/newtypes_tutorial.rst:853 msgid "" @@ -815,6 +1175,11 @@ msgid "" "type:`PyList_Type`; it should be done later in the module initialization " "function::" msgstr "" +"La estructura :c:type:`PyTypeObject` admite a :c:member:`~PyTypeObject." +"tp_base` especificando la clase base concreta del tipo. Debido a problemas " +"de compilación multiplataforma, no puede llenar ese campo directamente con " +"una referencia a :c:type:`PyList_Type`; debe hacerse más tarde en la función " +"de inicialización del módulo::" #: ../Doc/extending/newtypes_tutorial.rst:881 msgid "" @@ -824,28 +1189,39 @@ msgid "" "tp_alloc` slot with :c:func:`PyType_GenericNew` -- the allocation function " "from the base type will be inherited." msgstr "" +"Antes de llamar a :c:func:`PyType_Ready`, la estructura de tipo debe tener " +"el espacio :c:member:`~PyTypeObject.tp_base` rellenado. Cuando derivamos un " +"tipo existente, no es necesario completar el :c:member:`~PyTypeObject." +"tp_alloc` ranura con :c:func:`PyType_GenericNew` -- la función de asignación " +"del tipo base será heredada." #: ../Doc/extending/newtypes_tutorial.rst:887 msgid "" "After that, calling :c:func:`PyType_Ready` and adding the type object to the " "module is the same as with the basic :class:`Custom` examples." msgstr "" +"Después de eso, llamar a :c:func:`PyType_Ready` y agregar el objeto tipo al " +"módulo es lo mismo que con los ejemplos básicos :class:`Custom`." #: ../Doc/extending/newtypes_tutorial.rst:892 msgid "Footnotes" -msgstr "" +msgstr "Notas al pie" #: ../Doc/extending/newtypes_tutorial.rst:893 msgid "" "This is true when we know that the object is a basic type, like a string or " "a float." msgstr "" +"Esto es cierto cuando sabemos que el objeto es un tipo básico, como una " +"cadena o un flotador." #: ../Doc/extending/newtypes_tutorial.rst:896 msgid "" "We relied on this in the :c:member:`~PyTypeObject.tp_dealloc` handler in " "this example, because our type doesn't support garbage collection." msgstr "" +"Nos basamos en esto en el manejador :c:member:`~PyTypeObject.tp_dealloc` en " +"este ejemplo, porque nuestro tipo no admite la recolección de basura." #: ../Doc/extending/newtypes_tutorial.rst:899 msgid "" @@ -856,6 +1232,13 @@ msgid "" "deallocating an instance of a string subclass won't call back into our " "objects." msgstr "" +"Ahora sabemos que el primer y el último miembro son cadenas de caracteres, " +"por lo que quizás podríamos ser menos cuidadosos al disminuir sus recuentos " +"de referencia, sin embargo, aceptamos instancias de subclases de cadenas. A " +"pesar de que la desasignación de cadenas normales no volverá a llamar a " +"nuestros objetos, no podemos garantizar que la desasignación de una " +"instancia de una subclase de cadena de caracteres no vuelva a llamar a " +"nuestros objetos." #: ../Doc/extending/newtypes_tutorial.rst:905 msgid "" @@ -863,3 +1246,6 @@ msgid "" "could pass arbitrary :class:`str` subclasses and therefore still create " "reference cycles." msgstr "" +"Además, incluso con nuestros atributos restringidos a instancias de cadenas, " +"el usuario podría pasar subclases arbitrarias :class:`str` y, por lo tanto, " +"seguir creando ciclos de referencia." From 9f6197274d4c1a4dfde0ddfe0f1247b053a55cca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristi=C3=A1n=20Maureira-Fredes?= Date: Sun, 28 Jun 2020 20:12:07 +0200 Subject: [PATCH 2/4] Update extending/newtypes_tutorial.po --- extending/newtypes_tutorial.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extending/newtypes_tutorial.po b/extending/newtypes_tutorial.po index a24b4ce6f8..9c6e72e60d 100644 --- a/extending/newtypes_tutorial.po +++ b/extending/newtypes_tutorial.po @@ -102,7 +102,7 @@ msgid "" "familiar from the previous chapter. This file defines three things:" msgstr "" "Ahora, eso es bastante para asimilar a la vez, pero espero que los " -"fragmentos le resulten familiares en el capítulo anterior. Este archivo " +"fragmentos le resulten familiares del capítulo anterior. Este archivo " "define tres cosas:" #: ../Doc/extending/newtypes_tutorial.rst:53 From dad398edbb8599afd1e118945a6b16f02537defe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristi=C3=A1n=20Maureira-Fredes?= Date: Wed, 1 Jul 2020 18:53:48 +0200 Subject: [PATCH 3/4] Apply suggestions from code review Co-authored-by: Ricardo Bordon --- extending/newtypes_tutorial.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extending/newtypes_tutorial.po b/extending/newtypes_tutorial.po index 9c6e72e60d..5261bf8bd0 100644 --- a/extending/newtypes_tutorial.po +++ b/extending/newtypes_tutorial.po @@ -148,7 +148,7 @@ msgstr "" "Esto es lo que contendrá un objeto personalizado. ``PyObject_HEAD`` es " "obligatorio al comienzo de cada estructura de objeto y define un campo " "llamado ``ob_base`` de tipo :c:type:`PyObject`, que contiene un puntero a un " -"objeto de tipo y un recuento de referencia (estos pueden ser se accede " +"objeto de tipo y un recuento de referencia (estos pueden ser accedidos " "mediante las macros :c:macro:`Py_REFCNT` y :c:macro:`Py_TYPE` " "respectivamente). El motivo de la macro es abstraer el diseño y habilitar " "campos adicionales en las compilaciones de depuración." @@ -158,7 +158,7 @@ msgid "" "There is no semicolon above after the :c:macro:`PyObject_HEAD` macro. Be " "wary of adding one by accident: some compilers will complain." msgstr "" -"No hay punto y coma arriba después de la macro :c:macro:`PyObject_HEAD`. " +"No hay punto y coma (;) arriba después de la macro :c:macro:`PyObject_HEAD`. " "Tenga cuidado de agregar uno por accidente: algunos compiladores se quejarán." #: ../Doc/extending/newtypes_tutorial.rst:78 @@ -169,11 +169,11 @@ msgid "" msgstr "" "Por supuesto, los objetos generalmente almacenan datos adicionales además " "del estándar ``PyObject_HEAD`` repetitivo; por ejemplo, aquí está la " -"definición de flotadores Python estándar::" +"definición de puntos flotantes del estándar de Python::" #: ../Doc/extending/newtypes_tutorial.rst:87 msgid "The second bit is the definition of the type object. ::" -msgstr "El segundo bit es la definición del objeto tipo. ::" +msgstr "La segunda parte es la definición del tipo de objecto. ::" #: ../Doc/extending/newtypes_tutorial.rst:100 msgid "" From 878494e2aebd52c4c73c792df9097ee2dca76e41 Mon Sep 17 00:00:00 2001 From: Cristian Maureira-Fredes Date: Mon, 6 Jul 2020 12:36:43 +0200 Subject: [PATCH 4/4] powrap a extending/newtypes_tutorial --- extending/newtypes_tutorial.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extending/newtypes_tutorial.po b/extending/newtypes_tutorial.po index 5261bf8bd0..ab757d9206 100644 --- a/extending/newtypes_tutorial.po +++ b/extending/newtypes_tutorial.po @@ -102,8 +102,8 @@ msgid "" "familiar from the previous chapter. This file defines three things:" msgstr "" "Ahora, eso es bastante para asimilar a la vez, pero espero que los " -"fragmentos le resulten familiares del capítulo anterior. Este archivo " -"define tres cosas:" +"fragmentos le resulten familiares del capítulo anterior. Este archivo define " +"tres cosas:" #: ../Doc/extending/newtypes_tutorial.rst:53 msgid ""