[Python-checkins] r55056 - peps/trunk/pep-0000.txt peps/trunk/pep-3130.txt
david.goodger
python-checkins at python.org
Tue May 1 21:35:51 CEST 2007
Author: david.goodger
Date: Tue May 1 21:35:45 2007
New Revision: 55056
Added:
peps/trunk/pep-3130.txt (contents, props changed)
Modified:
peps/trunk/pep-0000.txt
Log:
added PEP 3130, Access to Current Module/Class/Function, by Jim J. Jewett
Modified: peps/trunk/pep-0000.txt
==============================================================================
--- peps/trunk/pep-0000.txt (original)
+++ peps/trunk/pep-0000.txt Tue May 1 21:35:45 2007
@@ -78,7 +78,7 @@
Accepted PEPs (accepted; may not be implemented yet)
SA 358 The "bytes" Object Schemenauer, GvR
- SA 3106 Revamping dict.keys(), .values() and .items() GvR
+ SA 3106 Revamping dict.keys(), .values() & .items() GvR
SA 3109 Raising Exceptions in Python 3000 Winter
SA 3110 Catching Exceptions in Python 3000 Winter
SA 3111 Simple input built-in in Python 3000 Roberge
@@ -128,6 +128,7 @@
S 3127 Integer Literal Support and Syntax Maupin
S 3128 BList: A Faster List-like Type Stutzbach
S 3129 Class Decorators Winter
+ S 3130 Access to Current Module/Class/Function Jewett
S 3141 A Type Hierarchy for Numbers Yasskin
Finished PEPs (done, implemented in Subversion)
@@ -193,7 +194,7 @@
SF 3104 Access to Names in Outer Scopes Yee
SF 3105 Make print a function Brandl
SF 3107 Function Annotations Winter, Lownds
- SF 3114 Renaming iterator.next() to iterator.__next__() Yee
+ SF 3114 Renaming iterator.next() to .__next__() Yee
Empty PEPs (or containing only an abstract)
@@ -234,7 +235,7 @@
SW 274 Dict Comprehensions Warsaw
SR 275 Switching on Multiple Values Lemburg
SR 276 Simple Iterator for ints Althoff
- SR 281 Loop Counter Iteration with range and xrange Hetland
+ SR 281 Loop Counter Iteration with range & xrange Hetland
SR 284 Integer for-loops Eppstein, Ewing
SW 288 Generators Attributes and Exceptions Hettinger
SR 294 Type Names in the types Module Tirosh
@@ -254,7 +255,7 @@
SW 321 Date/Time Parsing and Formatting Kuchling
SR 325 Resource-Release Support for Generators Pedroni
SR 326 A Case for Top and Bottom Values Carlson, Reedy
- SR 329 Treating Builtins as Constants in the Standard Library Hettinger
+ SR 329 Treating Builtins as Constants in the StdLib Hettinger
SR 330 Python Bytecode Verification Pelletier
SR 332 Byte vectors and String/Unicode Unification Montanaro
SW 334 Simple Coroutines via SuspendIteration Evans
@@ -377,7 +378,7 @@
SF 278 Universal Newline Support Jansen
SF 279 The enumerate() built-in function Hettinger
S 280 Optimizing access to globals GvR
- SR 281 Loop Counter Iteration with range and xrange Hetland
+ SR 281 Loop Counter Iteration with range & xrange Hetland
SF 282 A Logging System Sajip, Mick
IF 283 Python 2.3 Release Schedule GvR
SR 284 Integer for-loops Eppstein, Ewing
@@ -424,7 +425,7 @@
SR 326 A Case for Top and Bottom Values Carlson, Reedy
SF 327 Decimal Data Type Batista
SF 328 Imports: Multi-Line and Absolute/Relative Aahz
- SR 329 Treating Builtins as Constants in the Standard Library Hettinger
+ SR 329 Treating Builtins as Constants in the StdLib Hettinger
SR 330 Python Bytecode Verification Pelletier
S 331 Locale-Independent Float/String Conversions Reis
SR 332 Byte vectors and String/Unicode Unification Montanaro
@@ -474,7 +475,7 @@
SR 3103 A Switch/Case Statement GvR
SF 3104 Access to Names in Outer Scopes Yee
SF 3105 Make print a function Brandl
- SA 3106 Revamping dict.keys(), .values() and .items() GvR
+ SA 3106 Revamping dict.keys(), .values() & .items() GvR
SF 3107 Function Annotations Winter, Lownds
S 3108 Standard Library Reorganization Cannon
SA 3109 Raising Exceptions in Python 3000 Winter
@@ -482,7 +483,7 @@
SA 3111 Simple input built-in in Python 3000 Roberge
SA 3112 Bytes literals in Python 3000 Orendorff
SA 3113 Removal of Tuple Parameter Unpacking Cannon
- SF 3114 Renaming iterator.next() to iterator.__next__() Yee
+ SF 3114 Renaming iterator.next() to .__next__() Yee
SA 3115 Metaclasses in Python 3000 Talin
S 3116 New I/O Stutzbach, Verdone, GvR
S 3117 Postfix Type Declarations Brandl
@@ -498,6 +499,7 @@
S 3127 Integer Literal Support and Syntax Maupin
S 3128 BList: A Faster List-like Type Stutzbach
S 3129 Class Decorators Winter
+ S 3130 Access to Current Module/Class/Function Jewett
S 3141 A Type Hierarchy for Numbers Yasskin
Added: peps/trunk/pep-3130.txt
==============================================================================
--- (empty file)
+++ peps/trunk/pep-3130.txt Tue May 1 21:35:45 2007
@@ -0,0 +1,206 @@
+PEP: 3130
+Title: Access to Current Module/Class/Function
+Version: $Revision$
+Last-Modified: $Date$
+Author: Jim J. Jewett <jimjjewett at gmail.com>
+Status: Draft
+Type: Standards Track
+Content-Type: text/plain
+Created: 22-Apr-2007
+Python-Version: 3.0
+Post-History: 22-Apr-2007
+
+
+Abstract
+
+ It is common to need a reference to the current module, class,
+ or function, but there is currently no entirely correct way to
+ do this. This PEP proposes adding the keywords __module__,
+ __class__, and __function__.
+
+
+Rationale for __module__
+
+ Many modules export various functions, classes, and other objects,
+ but will perform additional activities (such as running unit
+ tests) when run as a script. The current idiom is to test whether
+ the module's name has been set to magic value.
+
+ if __name__ == "__main__": ...
+
+ More complicated introspection requires a module to (attempt to)
+ import itself. If importing the expected name actually produces
+ a different module, there is no good workaround.
+
+ # __import__ lets you use a variable, but... it gets more
+ # complicated if the module is in a package.
+ __import__(__name__)
+
+ # So just go to sys modules... and hope that the module wasn't
+ # hidden/removed (perhaps for security), that __name__ wasn't
+ # changed, and definitely hope that no other module with the
+ # same name is now available.
+ class X(object):
+ pass
+
+ import sys
+ mod = sys.modules[__name__]
+ mod = sys.modules[X.__class__.__module__]
+
+ Proposal: Add a __module__ keyword which refers to the module
+ currently being defined (executed). (But see open issues.)
+
+ # XXX sys.main is still changing as draft progresses. May
+ # really need sys.modules[sys.main]
+ if __module__ is sys.main: # assumes PEP (3122), Cannon
+ ...
+
+
+Rationale for __class__
+
+ Class methods are passed the current instance; from this they can
+ determine self.__class__ (or cls, for class methods).
+ Unfortunately, this reference is to the object's actual class,
+ which may be a subclass of the defining class. The current
+ workaround is to repeat the name of the class, and assume that the
+ name will not be rebound.
+
+ class C(B):
+
+ def meth(self):
+ super(C, self).meth() # Hope C is never rebound.
+
+ class D(C):
+
+ def meth(self):
+ # ?!? issubclass(D,C), so it "works":
+ super(C, self).meth()
+
+ Proposal: Add a __class__ keyword which refers to the class
+ currently being defined (executed). (But see open issues.)
+
+ class C(B):
+ def meth(self):
+ super(__class__, self).meth()
+
+ Note that super calls may be further simplified by the "New Super"
+ PEP (Spealman). The __class__ (or __this_class__) attribute came
+ up in attempts to simplify the explanation and/or implementation
+ of that PEP, but was separated out as an independent decision.
+
+ Note that __class__ (or __this_class__) is not quite the same as
+ the __thisclass__ property on bound super objects. The existing
+ super.__thisclass__ property refers to the class from which the
+ Method Resolution Order search begins. In the above class D, it
+ would refer to (the current reference of name) C.
+
+
+Rationale for __function__
+
+ Functions (including methods) often want access to themselves,
+ usually for a private storage location or true recursion. While
+ there are several workarounds, all have their drawbacks.
+
+ def counter(_total=[0]):
+ # _total shouldn't really appear in the
+ # signature at all; the list wrapping and
+ # [0] unwrapping obscure the code
+ _total[0] += 1
+ return _total[0]
+
+ @annotate(total=0)
+ def counter():
+ # Assume name counter is never rebound:
+ counter.total += 1
+ return counter.total
+
+ # class exists only to provide storage:
+ class _wrap(object):
+
+ __total = 0
+
+ def f(self):
+ self.__total += 1
+ return self.__total
+
+ # set module attribute to a bound method:
+ accum = _wrap().f
+
+ # This function calls "factorial", which should be itself --
+ # but the same programming styles that use heavy recursion
+ # often have a greater willingness to rebind function names.
+ def factorial(n):
+ return (n * factorial(n-1) if n else 1)
+
+ Proposal: Add a __function__ keyword which refers to the function
+ (or method) currently being defined (executed). (But see open
+ issues.)
+
+ @annotate(total=0)
+ def counter():
+ # Always refers to this function obj:
+ __function__.total += 1
+ return __function__.total
+
+ def factorial(n):
+ return (n * __function__(n-1) if n else 1)
+
+
+Backwards Compatibility
+
+ While a user could be using these names already, double-underscore
+ names ( __anything__ ) are explicitly reserved to the interpreter.
+ It is therefore acceptable to introduce special meaning to these
+ names within a single feature release.
+
+
+Implementation
+
+ Ideally, these names would be keywords treated specially by the
+ bytecode compiler.
+
+ Guido has suggested [1] using a cell variable filled in by the
+ metaclass.
+
+ Michele Simionato has provided a prototype using bytecode hacks
+ [2]. This does not require any new bytecode operators; it just
+ modifies the which specific sequence of existing operators gets
+ run.
+
+
+Open Issues
+
+ - Are __module__, __class__, and __function__ the right names? In
+ particular, should the names include the word "this", either as
+ __this_module__, __this_class__, and __this_function__, (format
+ discussed on the python-3000 and python-ideas lists) or as
+ __thismodule__, __thisclass__, and __thisfunction__ (inspired
+ by, but conflicting with, current usage of super.__thisclass__).
+
+ - Are all three keywords needed, or should this enhancement be
+ limited to a subset of the objects? Should methods be treated
+ separately from other functions?
+
+
+References
+
+ [1] Fixing super anyone? Guido van Rossum
+ http://mail.python.org/pipermail/python-3000/2007-April/006671.html
+
+ [2] Descriptor/Decorator challenge, Michele Simionato
+ http://groups.google.com/group/comp.lang.python/browse_frm/thread/a6010c7494871bb1/62a2da68961caeb6?lnk=gst&q=simionato+challenge&rnum=1&hl=en#62a2da68961caeb6
+
+
+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:
More information about the Python-checkins
mailing list