negar - true python




En python, ¿hay algún tipo de mapeo para devolver el "valor falso" de un tipo? (4)

Estoy buscando algún tipo de función de mapeo f() que haga algo similar a esto:

f(str) = ''
f(complex) = 0j
f(list) = []

Lo que significa que devuelve un objeto de tipo que se evalúa como False cuando se lo bool a bool .

¿Existe tal función?


Esto se llama realmente un elemento de identidad , y en la programación se ve más a menudo como parte de la definición de un monoid . En python, puede obtenerlo para un tipo usando la función mzero en el paquete PyMonad . Haskell lo llama mempty .


No existe tal función porque no es posible en general. Una clase puede no tener valor falso o puede requerir la inversión de una implementación arbitrariamente compleja de __bool__ .

Lo que podrías hacer rompiendo todo lo demás es construir un nuevo objeto de esa clase y asignar a la fuerza su función __bool__ a una que devuelva False . Aunque sospecho que estás buscando un objeto que de otro modo sería un miembro válido de la clase.

En cualquier caso, esta es una muy mala idea en estilo clásico.


No, no hay tal mapeo. No todo tipo de objeto tiene un valor falso, y otros tienen más de uno. Como el valor de verdad de una clase se puede personalizar con el método __bool__ , una clase podría teóricamente tener un número infinito de instancias falsy (diferentes).

Dicho esto, la mayoría de los tipos incorporados devuelven su valor falsy cuando se llama a su constructor sin argumentos:

>>> str()
''
>>> complex()
0j
>>> list()
[]

No, y en general, puede no haber tal valor. El modelo de datos de Python es bastante flexible sobre cómo se puede implementar el valor de verdad de un tipo:

object.__bool__(self)

Llamado para implementar pruebas de valor verdad y la operación incorporada bool (); debe devolver Falso o Verdadero. Cuando este método no está definido, se __len__() , si está definido, y el objeto se considera verdadero si su resultado es distinto de cero. Si una clase no define ni __len__() ni __bool__() , todas sus instancias se consideran verdaderas.

Así que considere:

import random
class Wacky:
    def __bool__(self):
        return bool(random.randint(0,1))

¿Qué debería devolver f(Wacky) ?





boolean