[Python-ideas] Extending __format__ method in ipaddress

Nick Coghlan ncoghlan at gmail.com
Wed Feb 14 22:52:13 EST 2018

On 15 February 2018 at 08:29, Eric Osborne <eric at notcom.com> wrote:
>   Nick Coghlan suggested I instead extend __format__, which is what the
> diffs in the current pull request do.  This allows a great deal more
> flexibility: the current code takes 'b', 'n', or 'x' types, as well as the
> '#' option and support for the '_' separator.

+1 from me (unsurprisingly).

We added __format__ specifically to give types more control over how
they're printed, and this approach is amenable to the simple
explanation that the custom IP address formatting works via:

- conversion to int
- printing in a fixed width field (based on the address size)
- in binary or hex based on either the given format character, or the
address size ("n", where IPv4=b and IPv6=x)
- with a suitable prefix if "#" is given
- with four-digit separators if "_" is given

>  I realize now I didn't add
> 'o' but I certainly can for completeness.

I'd suggest leaving it out, as octal characters are 3 bits each, so
they don't have a natural association with IP address representations
any more than decimal representation does (neither 32 nor 128 are
divisible by 3).

>  I debated adding rfc1924 encoding
> for IPv6 addresses but decided it was entirely too silly.

Yeah, if we decided to support that, we likely *would* add a separate
method for it.

__format__ works well for "print an IP address as an integer with
zero-padding and an automatically calculated field width" though,
since we can borrow the notation from regular integer formatting to
select the digit base and tweak the display details.


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

More information about the Python-ideas mailing list