Cómo criar a excepción si Ninguno valor encontrado en dict?

Quiero plantear una KeyError excepción si el valor devuelto es None, pero el siguiente lanza un SyntaxError: invalid syntax excepción.

try:
   protocol = serverInfo_D['protocol'] or raise KeyError("protocol not present")
except KeyError:
   print "Improper server config"

Lo que es una manera simple de conseguir este trabajo?

  • AFAIK Python diccionario ya que arroja un KeyError excepción si la clave especificada falta.
  • Él está tratando de aumentar la excepción cuando el valor es None, no sólo cuando la clave es que faltan.
InformationsquelleAutor goutham | 2010-12-23

5 Kommentare

  1. 6

    Usted está consiguiendo un SyntaxError porque raise es una declaración, no una expresión, por lo que el or raise KeyError parte no hacer [sintáctica] sentido. Una solución es poner el mismo que en una función como la siguiente, que se llama sólo si la veía a un valor es algo que no es Cierto, como None, 0, '', y [].

    Advertencia: tenga en cuenta que esto es potencialmente confuso, ya que lo que efectivamente hace es que la presencia de cualquiera de los tipos de valores parece ser como si la protocol clave no estaba allí, aunque técnicamente era…así que puede que desee considerar la posibilidad de derivar su propia especializada clase de excepción de uno de los construido-ins y, a continuación, tratar con ellos en vez de [ab]con lo que KeyError normalmente significa.

    def raise_KeyError(msg=''): raise KeyError(msg)  # Don't return anything.
    
    try:
       protocol = serverInfo_D['protocol'] or raise_KeyError('protocol not present')
    except KeyError:
       print 'Improper server config!'
    • es tan tonto que subir no es una expresión en python 3, es como que no aprenden nada de la impresión fiasco
  2. 6

    Si quieres que sea en una línea siempre se puede hacer una función:

    def valueOrRaise(data, key):
        value = data.get(key)
        if value is None:
            raise KeyError("%s not present" % key)
        return value
    
    try:
        protocol = valueOrRaise(serverInfo_D, 'protocol')
    except KeyError:
        print "server config is not proper"
  3. 2

    ¿Por qué usted quiere tener una excepción, si usted está realmente utilizando como este? Sólo uso .get() y comprobar None.

    protocol = serverInfo_D.get('protocol')
    if protocol is None:
       print "server config is not proper"
    • Debido a que algunos programas necesitan de bloqueo si la clave no existe, porque significa que algo salió terriblemente mal y dejar que el programa continúe acaba de provocar un comportamiento impredecible.
  4. 1

    La try y except KeyError combinación debe funcionar. Lo que no está trabajando para usted?

    Y ya que este en la continuación de la pregunta anterior, que no fue a trabajar porque estaba utilizando dict.get, que nunca lanza KeyError.

    Sin embargo, el código en esta cuestión. Y usted no necesita or raise KeyError.

    >>> d = dict(a=1, b=2)
    >>> d.get('c')  # no KeyError
    >>> d['c']      # KeyError
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'c'
    • lo que si d[‘c’] contiene un valor None?
    • El or raise KeyError parte de la OP del código es un SyntaxError porque raise es una declaración, no una expresión.
    • No se muy bien lo que el OP preguntó – el valor está presente, por lo que no levantará el KeyError, pero tiene un valor None, que el OP quiere ser un caso de excepción.
    • Si usted echa un vistazo a la pregunta del OP preguntó antes de esto, hace que mi punto claro qué es lo que estoy tratando de decir. Me contestó que así era yo basándose en que. Yo tal vez mal, pero creo que el OP era confuso, la respuesta a la pregunta anterior y que es lo que quería aclarar. Si es malo, hágamelo saber y voy a editar/ borrar en consecuencia.
  5. 0

    Creo que esto es más a lo largo de las líneas de lo que usted desea. Por favor comente si usted necesita para cambiar.

    try:
        protocol = serverInfo_D['protocol'] 
        if protocol == None:
            raise KeyError("protocol not present")

    Espero que esto ayude

    • no podemos usar o y ponerlo en una sola línea.. coz tengo mucho de dichas validaciones.
    • is None será mejor.
    • Creo que esto resuelve un problema diferente; él asume que si el protocolo especificado no se controla, a continuación, serverInfo_D[‘protocolo’] no se establece, por lo tanto la asignación de lanza de un KeyError. El código parece asumir que se establece en Ninguno, por lo tanto un KeyError debe ser lanzado manualmente.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea