7

En Python, las funciones como str(), int(), float(), etc. generalmente se utilizan para realizar conversiones de tipo. Sin embargo, estos requieren que sepa en el momento del desarrollo a qué tipo desea convertir. Un subproblema de un código Python que estoy tratando de escribir es como sigue:Reflexión de Python y conversión de tipo

Dadas dos variables, foo y bar, encontrar el tipo de foo. (No se conoce en el momento del desarrollo, ya que es un código genérico). Luego, intente convertir bar al tipo foo. Si esto no se puede hacer, lanza una excepción.

Por ejemplo, supongamos que llama a la función que hace esto conv. Su firma se vería

def conv(foo, bar) : 
    # Do stuff. 

Se llamaría algo así como:

result = conv(3.14, "2.718") # result is now 2.718, as a float. 

Respuesta

11

Uso foo.__class__ para obtener el tipo de foo. A continuación, llame para convertir barras para el tipo de foo:

def conv(foo, bar) : 
    return foo.__class__(bar) 

Por supuesto, esto sólo funciona si el tipo de foo tiene un constructor que sabe cómo convertir bar.

+0

Impresionante. Nunca hubiera pensado que sería increíblemente fácil. También es sorprendente (soy nuevo en Python y estoy acostumbrado a los lenguajes de metal) es que funciona con builtins. – dsimcha

+0

Parcialmente incorrecto. foo .__ class__ es solo el tipo de foo si foo es un objeto de estilo nuevo. De lo contrario, es solo la clase. –

+0

Solo incorrecto, ya que dije 'tipo' cuando la clase sería más precisa. Pero él necesita la clase para esta conversión. Y en Python 3, la diferencia ya no existe. – oefe

16

que sería mejor:

type(foo)(bar) 
+0

solo en Python 3.0. En Python 2.x, esto funcionará solo para "clases de nuevo estilo" y construcciones internas. – oefe

0
type(foo) 

es sin duda la mejor, si usted quiere comprobar a continuación, un tipo "tipo" es el mejor método, y estoy en python 2.7 - 3.2.2, type() funciona perfectamente.

Cuestiones relacionadas