[Python-checkins] peps: PEP 515: underscores in numeric literals.
georg.brandl
python-checkins at python.org
Wed Feb 10 17:16:33 EST 2016
https://hg.python.org/peps/rev/d42c0678191d
changeset: 6222:d42c0678191d
user: Georg Brandl <georg at python.org>
date: Wed Feb 10 23:16:04 2016 +0100
summary:
PEP 515: underscores in numeric literals.
files:
pep-0515.txt | 178 +++++++++++++++++++++++++++++++++++++++
1 files changed, 178 insertions(+), 0 deletions(-)
diff --git a/pep-0515.txt b/pep-0515.txt
new file mode 100644
--- /dev/null
+++ b/pep-0515.txt
@@ -0,0 +1,178 @@
+PEP: 515
+Title: Underscores in Numeric Literals
+Version: $Revision$
+Last-Modified: $Date$
+Author: Georg Brandl
+Status: Draft
+Type: Standards Track
+Content-Type: text/x-rst
+Created: 10-Feb-2016
+Python-Version: 3.6
+
+Abstract and Rationale
+======================
+
+This PEP proposes to extend Python's syntax so that underscores can be used in
+integral and floating-point number literals.
+
+This is a common feature of other modern languages, and can aid readability of
+long literals, or literals whose value should clearly separate into parts, such
+as bytes or words in hexadecimal notation.
+
+Examples::
+
+ # grouping decimal numbers by thousands
+ amount = 10_000_000.0
+
+ # grouping hexadecimal addresses by words
+ addr = 0xDEAD_BEEF
+
+ # grouping bits into bytes in a binary literal
+ flags = 0b_0011_1111_0100_1110
+
+
+Specification
+=============
+
+The current proposal is to allow underscores anywhere in numeric literals, with
+these exceptions:
+
+* Leading underscores cannot be allowed, since they already introduce
+ identifiers.
+* Trailing underscores are not allowed, because they look confusing and don't
+ contribute much to readability.
+* The number base prefixes ``0x``, ``0o``, and ``0b`` cannot be split up,
+ because they are fixed strings and not logically part of the number.
+* No underscore allowed after a sign in an exponent (``1e-_5``), because
+ underscores can also not be used after the signs in front of the number
+ (``-1e5``).
+* No underscore allowed after a decimal point, because this leads to ambiguity
+ with attribute access (the lexer cannot know that there is no number literal
+ in ``foo._5``).
+
+There appears to be no reason to restrict the use of underscores otherwise.
+
+The production list for integer literals would therefore look like this::
+
+ integer: decimalinteger | octinteger | hexinteger | bininteger
+ decimalinteger: nonzerodigit [decimalrest] | "0" [("0" | "_")* "0"]
+ nonzerodigit: "1"..."9"
+ decimalrest: (digit | "_")* digit
+ digit: "0"..."9"
+ octinteger: "0" ("o" | "O") (octdigit | "_")* octdigit
+ hexinteger: "0" ("x" | "X") (hexdigit | "_")* hexdigit
+ bininteger: "0" ("b" | "B") (bindigit | "_")* bindigit
+ octdigit: "0"..."7"
+ hexdigit: digit | "a"..."f" | "A"..."F"
+ bindigit: "0" | "1"
+
+For floating-point literals::
+
+ floatnumber: pointfloat | exponentfloat
+ pointfloat: [intpart] fraction | intpart "."
+ exponentfloat: (intpart | pointfloat) exponent
+ intpart: digit (digit | "_")*
+ fraction: "." intpart
+ exponent: ("e" | "E") "_"* ["+" | "-"] digit [decimalrest]
+
+
+Alternative Syntax
+==================
+
+Underscore Placement Rules
+--------------------------
+
+Instead of the liberal rule specified above, the use of underscores could be
+limited. Common rules are (see the "other languages" section):
+
+* Only one consecutive underscore allowed, and only between digits.
+* Multiple consecutive underscore allowed, but only between digits.
+
+Different Separators
+--------------------
+
+A proposed alternate syntax was to use whitespace for grouping. Although
+strings are a precedent for combining adjoining literals, the behavior can lead
+to unexpected effects which are not possible with underscores. Also, no other
+language is known to use this rule, except for languages that generally
+disregard any whitespace.
+
+C++14 introduces apostrophes for grouping, which is not considered due to the
+conflict with Python's string literals. [1]_
+
+
+Behavior in Other Languages
+===========================
+
+Those languages that do allow underscore grouping implement a large variety of
+rules for allowed placement of underscores. This is a listing placing the known
+rules into three major groups. In cases where the language spec contradicts the
+actual behavior, the actual behavior is listed.
+
+**Group 1: liberal (like this PEP)**
+
+* D [2]_
+* Perl 5 (although docs say it's more restricted) [3]_
+* Rust [4]_
+* Swift (although textual description says "between digits") [5]_
+
+**Group 2: only between digits, multiple consecutive underscores**
+
+* C# (open proposal for 7.0) [6]_
+* Java [7]_
+
+**Group 3: only between digits, only one underscore**
+
+* Ada [8]_
+* Julia (but not in the exponent part of floats) [9]_
+* Ruby (docs say "anywhere", in reality only between digits) [10]_
+
+
+Implementation
+==============
+
+A preliminary patch that implements the specification given above has been
+posted to the issue tracker. [11]_
+
+
+References
+==========
+
+.. [1] http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3499.html
+
+.. [2] http://dlang.org/spec/lex.html#integerliteral
+
+.. [3] http://perldoc.perl.org/perldata.html#Scalar-value-constructors
+
+.. [4] http://doc.rust-lang.org/reference.html#number-literals
+
+.. [5] https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/LexicalStructure.html
+
+.. [6] https://github.com/dotnet/roslyn/issues/216
+
+.. [7] https://docs.oracle.com/javase/7/docs/technotes/guides/language/underscores-literals.html
+
+.. [8] http://archive.adaic.com/standards/83lrm/html/lrm-02-04.html#2.4
+
+.. [9] http://docs.julialang.org/en/release-0.4/manual/integers-and-floating-point-numbers/
+
+.. [10] http://ruby-doc.org/core-2.3.0/doc/syntax/literals_rdoc.html#label-Numbers
+
+.. [11] http://bugs.python.org/issue26331
+
+
+Copyright
+=========
+
+This document has been placed in the public domain.
+
+
+
+..
+ Local Variables:
+ mode: indented-text
+ indent-tabs-mode: nil
+ sentence-end-double-space: t
+ fill-column: 70
+ coding: utf-8
+ End:
--
Repository URL: https://hg.python.org/peps
More information about the Python-checkins
mailing list