On 13 October 2016 at 12:54, Nick Coghlan <[email protected]> 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 | [email protected] | Brisbane, Australia
_______________________________________________
Python-Dev mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com