fluentpython / example-code

Example code for the book Fluent Python, 1st Edition (O'Reilly, 2015)
http://bit.ly/fluentpy
MIT License
5.56k stars 2.18k forks source link

_abc_registry attribute is not available in python 3.7.0 #24

Open alpnn opened 6 years ago

alpnn commented 6 years ago

When I try running the tombola_runner.py in chapter 11, python reports to me that the '_abc_registry' doesn't exist.

I searched in docs, but found that the attribute is not accesible anymore.

The changelog is """ bpo-31333: _abc module is added. It is a speedup module with C implementations for various functions and methods in abc. Creating an ABC subclass and calling isinstance or issubclass with an ABC subclass are up to 1.5x faster. In addition, this makes Python start-up up to 10% faster.

Note that the new implementation hides internal registry and caches, previously accessible via private attributes _abc_registry, _abc_cache, and _abc_negative_cache. There are three debugging helper methods that can be used instead _dump_registry, _abc_registry_clear, and _abc_caches_clear. """

ShubhamBelwal commented 5 years ago

You can use abc._get_dump(Tombola) - it returns a 4-tuple of (_abc_registry, _abc_cache, _abc_negative_cache, _abc_negative_cache_version)

The following code should work:

import abc virtual_subclasses = [ref() for ref in abc._get_dump(Tombola)[0] if ref()]

Credit goes to: u/K9000_ from the reddit thread

anancds commented 4 years ago

@ShubhamBelwal thanks, it fixed my same problem.