[Python-Dev] Adding bytes.frombuffer() constructor to PEP 467 (was: [Python-ideas] Adding bytes.frombuffer() constructor (original) (raw)

Nick Coghlan ncoghlan at gmail.com
Wed Oct 12 23:31:02 EDT 2016


On 13 October 2016 at 12:54, Nick Coghlan <ncoghlan at gmail.com> wrote:

Method proliferation on builtins is a Big Deal(TM)

I wanted to quantify this concept, so here's a quick metric that helps convey how every time we add a new builtin method we're immediately making Python harder to comprehend:

>>> def get_builtin_types():
...     import builtins
...     return {name:obj for name, obj in vars(builtins).items()

if isinstance(obj, type) and not (name.startswith("") or issubclass(obj, BaseException))} ... >>> len(get_builtin_types()) 26 >>> def get_builtin_methods(): ... return [(name, method_name) for name, obj in get_builtin_types().items() for method_name, method in vars(obj).items() if not method_name.startswith("")] ... >>> len(get_builtin_methods()) 230

Putting special purpose functionality behind an import gate helps to provide a more explicit context of use (in this case, IO buffer manipulation) vs the relatively domain independent namespace that is the builtins.

Cheers, Nick.

P.S. Since I was poking around in the builtins anyway, here are some other simple language complexity metrics:

>>> len(vars(builtins))
151
>>> def get_interpreter_builtins():
...     import builtins
...     return {name:obj for name, obj in vars(builtins).items()

if name.startswith("")} ... >>> len(get_interpreter_builtins()) 8 >>> def get_builtin_exceptions(): ... import builtins ... return {name:obj for name, obj in vars(builtins).items() if isinstance(obj, type) and issubclass(obj, BaseException)} ... >>> len(get_builtin_exceptions()) 65 >>> def get_builtin_functions(): ... import builtins ... return {name:obj for name, obj in vars(builtins).items() if isinstance(obj, type(repr))} ... >>> len(get_builtin_functions()) 42 >>> def get_other_builtins(): ... import builtins ... return {name:obj for name, obj in vars(builtins).items() if not name.startswith("") and not isinstance(obj, (type, type(repr)))} ... >>> len(get_other_builtins()) 12

The "other" builtins are the builtin constants (None, True, False, Ellipsis, NotImplemented) and various artifacts from doing this at the interactive prompt (license, credits, copyright, quit, exit, help, "_")

-- Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia



More information about the Python-Dev mailing list