Pregunta

creo un archivo llamado foo_module.py que contiene el siguiente código:

import shelve, whichdb, os

from foo_package.g import g

g.shelf = shelve.open("foo_path")
g.shelf.close() 

print whichdb.whichdb("foo_path")  # => dbhash
os.remove("foo_path")

Al lado de ese archivo creo un directorio llamado foo_package que contiene un vacío __init__.py archivo y un archivo llamado g.py que solo contiene:

class g:
    pass

Ahora cuando corro foo_module.py Recibo un mensaje de error extraño:

Exception TypeError: "'NoneType' object is not callable" in ignored

Pero luego, si cambio el nombre del directorio de foo_package a foo, y cambiar la línea de importación en foo_module.py, no me sale ningún error.¿Qué está pasando aquí?

Ejecutando Python 2.6.4 en WinXP.

¿Fue útil?

Solución

Creo que ha encontrado un error menor en el código de 2.6.4 relacionado con la limpieza al final del programa.Si tu corres python -v Puedes ver exactamente en qué punto de la limpieza aparece el error:

# cleanup[1] foo_package.g
Exception TypeError: "'NoneType' object is not callable" in  ignored

Python establece referencias a None durante la limpieza al final del programa, y ​​parece que se está confundiendo sobre el estado de g.shelf.Como solución alternativa, podría establecer g.shelf = None después de la close.¡También recomendaría abrir un error en el rastreador de errores de Python!

Otros consejos

Después de días de pérdida de cabello, que finalmente tuvieron éxito en el uso de una función de atexit:

  import atexit
  ...
  cache = shelve.open(path)
  atexit.register(cache.close)

Es más adecuado para registrarse inmediatamente después de abrirla. Esto funciona con múltiples estantes concurrentes.

(Python 2.6.5 en lúcido)

Este es de hecho un error de Python, y he publicado un parche para el seguimiento de incidencias que se abrió (gracias por hacer eso).

El problema es que la estantería de del método llama a su método de cerca, pero si el módulo de estantería ya ha sido a través de la limpieza, el método close falla con el mensaje que se ve.

Se puede evitar el mensaje en su código añadiendo 'del g.shelf' después g.shelf.close. Mientras g.shelf es la única referencia a la plataforma, esto se traducirá en CPython llamando a la estantería del Método de inmediato, antes de la fase de limpieza intérprete, y así evitar el mensaje de error.

Parece ser una excepción en una función de desconexión registrado por el módulo shelve. La parte "ignorado" es desde el sistema de apagado, y puede ser que consiga su redacción mejorado en algún momento, por Edición 6294 . Todavía estoy esperando una respuesta sobre cómo eliminar la excepción en sí, aunque ...

para mí un simple shelve.close() en uno sin cerrar hizo el trabajo.

shelve.open ( 'somefile') devuelve un "diccionario persistente para la lectura y la escritura" objeto que he usado a lo largo de tiempo de ejecución de la aplicación. cuando por terminada la aplicación recibí la excepción "TypeError" como se ha mencionado. Me plased una 'estrecha) (' llamada en mi secuencia de terminación y que parecía para solucionar el problema.

por ejemplo. shelveObj = shelve.open ( 'filename') ... shelveObj.close ()

OverByThere comentado el 17 jul, 2018

Esto parece ser corregible.

En línea corta /usr/lib/python3.5/weakref.py y el cambio abierto 109 a:

 def remove(wr, selfref=ref(self), _atomic_removal=_remove_dead_weakref):

Y la línea 117 a:

_atomic_removal(d, wr.key)

Tenga en cuenta que tiene que hacer esto con espacios, no fichas ya que esto hará que otros errores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top