diff options
48 files changed, 515 insertions, 253 deletions
diff --git a/Doc/ACKS.txt b/Doc/ACKS.txt index 7f67d36..1ad18f1 100644 --- a/Doc/ACKS.txt +++ b/Doc/ACKS.txt @@ -105,6 +105,7 @@ docs@python.org), and we'll be glad to correct the problem. * Robert Kern * Jim Kerr * Jan Kim + * Kamil Kisiel * Greg Kochanski * Guido Kollerie * Peter A. Koren @@ -142,7 +143,7 @@ docs@python.org), and we'll be glad to correct the problem. * Ross Moore * Sjoerd Mullender * Dale Nagata - * Michal Nowikowski + * Michal Nowikowski * Ng Pheng Siong * Koray Oner * Tomas Oppelstrup diff --git a/Doc/library/cmd.rst b/Doc/library/cmd.rst index 464764d..e9a049f 100644 --- a/Doc/library/cmd.rst +++ b/Doc/library/cmd.rst @@ -50,7 +50,7 @@ A :class:`Cmd` instance has the following methods: the line as argument. The optional argument is a banner or intro string to be issued before the first - prompt (this overrides the :attr:`intro` class member). + prompt (this overrides the :attr:`intro` class attribute). If the :mod:`readline` module is loaded, input will automatically inherit :program:`bash`\ -like history-list editing (e.g. :kbd:`Control-P` scrolls back diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index b7039de..16b7681 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -1639,7 +1639,7 @@ You can instantiate a :class:`Textbox` object as follows: each keystroke entered with the keystroke as a parameter; command dispatch is done on the result. This method returns the window contents as a string; whether blanks in the window are included is affected by the - :attr:`stripspaces` member. + :attr:`stripspaces` attribute. .. method:: do_command(ch) @@ -1711,7 +1711,7 @@ You can instantiate a :class:`Textbox` object as follows: .. attribute:: stripspaces - This data member is a flag which controls the interpretation of blanks in + This attribute is a flag which controls the interpretation of blanks in the window. When it is on, trailing blanks on each line are ignored; any cursor motion that would land the cursor on a trailing blank goes to the end of that line instead, and trailing blanks are stripped when the window diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index de9ad44..56fa698 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -11,7 +11,7 @@ The :mod:`datetime` module supplies classes for manipulating dates and times in both simple and complex ways. While date and time arithmetic is supported, the -focus of the implementation is on efficient member extraction for output +focus of the implementation is on efficient attribute extraction for output formatting and manipulation. For related functionality, see also the :mod:`time` and :mod:`calendar` modules. @@ -25,7 +25,7 @@ miles, or mass. Naive :class:`datetime` objects are easy to understand and to work with, at the cost of ignoring some aspects of reality. For applications requiring more, :class:`datetime` and :class:`time` objects -have an optional time zone information member, :attr:`tzinfo`, that can contain +have an optional time zone information attribute, :attr:`tzinfo`, that can contain an instance of a subclass of the abstract :class:`tzinfo` class. These :class:`tzinfo` objects capture information about the offset from UTC time, the time zone name, and whether Daylight Saving Time is in effect. Note that only @@ -499,9 +499,9 @@ Instance methods: .. method:: date.replace(year, month, day) - Return a date with the same value, except for those members given new values by - whichever keyword arguments are specified. For example, if ``d == date(2002, - 12, 31)``, then ``d.replace(day=26) == date(2002, 12, 26)``. + Return a date with the same value, except for those parameters given new + values by whichever keyword arguments are specified. For example, if ``d == + date(2002, 12, 31)``, then ``d.replace(day=26) == date(2002, 12, 26)``. .. method:: date.timetuple() @@ -732,11 +732,11 @@ Other constructors, all class methods: .. classmethod:: datetime.combine(date, time) - Return a new :class:`datetime` object whose date members are equal to the given - :class:`date` object's, and whose time and :attr:`tzinfo` members are equal to - the given :class:`time` object's. For any :class:`datetime` object *d*, ``d == - datetime.combine(d.date(), d.timetz())``. If date is a :class:`datetime` - object, its time and :attr:`tzinfo` members are ignored. + Return a new :class:`datetime` object whose date attributes are equal to the + given :class:`date` object's, and whose time and :attr:`tzinfo` attributes are + equal to the given :class:`time` object's. For any :class:`datetime` object + *d*, ``d == datetime.combine(d.date(), d.timetz())``. If date is a + :class:`datetime` object, its time and :attr:`tzinfo` attributes are ignored. .. classmethod:: datetime.strptime(date_string, format) @@ -830,43 +830,44 @@ Supported operations: (1) datetime2 is a duration of timedelta removed from datetime1, moving forward in time if ``timedelta.days`` > 0, or backward if ``timedelta.days`` < 0. The - result has the same :attr:`tzinfo` member as the input datetime, and datetime2 - - datetime1 == timedelta after. :exc:`OverflowError` is raised if datetime2.year - would be smaller than :const:`MINYEAR` or larger than :const:`MAXYEAR`. Note - that no time zone adjustments are done even if the input is an aware object. + result has the same :attr:`tzinfo` attribute as the input datetime, and + datetime2 - datetime1 == timedelta after. :exc:`OverflowError` is raised if + datetime2.year would be smaller than :const:`MINYEAR` or larger than + :const:`MAXYEAR`. Note that no time zone adjustments are done even if the + input is an aware object. (2) Computes the datetime2 such that datetime2 + timedelta == datetime1. As for - addition, the result has the same :attr:`tzinfo` member as the input datetime, - and no time zone adjustments are done even if the input is aware. This isn't - quite equivalent to datetime1 + (-timedelta), because -timedelta in isolation - can overflow in cases where datetime1 - timedelta does not. + addition, the result has the same :attr:`tzinfo` attribute as the input + datetime, and no time zone adjustments are done even if the input is aware. + This isn't quite equivalent to datetime1 + (-timedelta), because -timedelta + in isolation can overflow in cases where datetime1 - timedelta does not. (3) Subtraction of a :class:`datetime` from a :class:`datetime` is defined only if both operands are naive, or if both are aware. If one is aware and the other is naive, :exc:`TypeError` is raised. - If both are naive, or both are aware and have the same :attr:`tzinfo` member, - the :attr:`tzinfo` members are ignored, and the result is a :class:`timedelta` + If both are naive, or both are aware and have the same :attr:`tzinfo` attribute, + the :attr:`tzinfo` attributes are ignored, and the result is a :class:`timedelta` object *t* such that ``datetime2 + t == datetime1``. No time zone adjustments are done in this case. - If both are aware and have different :attr:`tzinfo` members, ``a-b`` acts as if - *a* and *b* were first converted to naive UTC datetimes first. The result is - ``(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - - b.utcoffset())`` except that the implementation never overflows. + If both are aware and have different :attr:`tzinfo` attributes, ``a-b`` acts + as if *a* and *b* were first converted to naive UTC datetimes first. The + result is ``(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) + - b.utcoffset())`` except that the implementation never overflows. (4) *datetime1* is considered less than *datetime2* when *datetime1* precedes *datetime2* in time. If one comparand is naive and the other is aware, :exc:`TypeError` is raised. - If both comparands are aware, and have the same :attr:`tzinfo` member, the - common :attr:`tzinfo` member is ignored and the base datetimes are compared. If - both comparands are aware and have different :attr:`tzinfo` members, the - comparands are first adjusted by subtracting their UTC offsets (obtained from - ``self.utcoffset()``). + If both comparands are aware, and have the same :attr:`tzinfo` attribute, the + common :attr:`tzinfo` attribute is ignored and the base datetimes are + compared. If both comparands are aware and have different :attr:`tzinfo` + attributes, the comparands are first adjusted by subtracting their UTC + offsets (obtained from ``self.utcoffset()``). .. note:: @@ -899,22 +900,22 @@ Instance methods: .. method:: datetime.timetz() Return :class:`time` object with same hour, minute, second, microsecond, and - tzinfo members. See also method :meth:`time`. + tzinfo attributes. See also method :meth:`time`. .. method:: datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]]) - Return a datetime with the same members, except for those members given new - values by whichever keyword arguments are specified. Note that ``tzinfo=None`` - can be specified to create a naive datetime from an aware datetime with no - conversion of date and time members. + Return a datetime with the same attributes, except for those attributes given + new values by whichever keyword arguments are specified. Note that + ``tzinfo=None`` can be specified to create a naive datetime from an aware + datetime with no conversion of date and time attributes. .. method:: datetime.astimezone(tz) - Return a :class:`datetime` object with new :attr:`tzinfo` member *tz*, adjusting - the date and time members so the result is the same UTC time as *self*, but in - *tz*'s local time. + Return a :class:`datetime` object with new :attr:`tzinfo` attribute *tz*, + adjusting the date and time attributes so the result is the same UTC time as + *self*, but in *tz*'s local time. *tz* must be an instance of a :class:`tzinfo` subclass, and its :meth:`utcoffset` and :meth:`dst` methods must not return ``None``. *self* must @@ -922,18 +923,18 @@ Instance methods: not return ``None``). If ``self.tzinfo`` is *tz*, ``self.astimezone(tz)`` is equal to *self*: no - adjustment of date or time members is performed. Else the result is local time - in time zone *tz*, representing the same UTC time as *self*: after ``astz = - dt.astimezone(tz)``, ``astz - astz.utcoffset()`` will usually have the same date - and time members as ``dt - dt.utcoffset()``. The discussion of class - :class:`tzinfo` explains the cases at Daylight Saving Time transition boundaries - where this cannot be achieved (an issue only if *tz* models both standard and - daylight time). + adjustment of date or time attributes is performed. Else the result is local + time in time zone *tz*, representing the same UTC time as *self*: after + ``astz = dt.astimezone(tz)``, ``astz - astz.utcoffset()`` will usually have + the same date and time attributes as ``dt - dt.utcoffset()``. The discussion + of class :class:`tzinfo` explains the cases at Daylight Saving Time transition + boundaries where this cannot be achieved (an issue only if *tz* models both + standard and daylight time). If you merely want to attach a time zone object *tz* to a datetime *dt* without - adjustment of date and time members, use ``dt.replace(tzinfo=tz)``. If you + adjustment of date and time attributes, use ``dt.replace(tzinfo=tz)``. If you merely want to remove the time zone object from an aware datetime *dt* without - conversion of date and time members, use ``dt.replace(tzinfo=None)``. + conversion of date and time attributes, use ``dt.replace(tzinfo=None)``. Note that the default :meth:`tzinfo.fromutc` method can be overridden in a :class:`tzinfo` subclass to affect the result returned by :meth:`astimezone`. @@ -1244,14 +1245,14 @@ Supported operations: * comparison of :class:`time` to :class:`time`, where *a* is considered less than *b* when *a* precedes *b* in time. If one comparand is naive and the other is aware, :exc:`TypeError` is raised. If both comparands are aware, and have - the same :attr:`tzinfo` member, the common :attr:`tzinfo` member is ignored and - the base times are compared. If both comparands are aware and have different - :attr:`tzinfo` members, the comparands are first adjusted by subtracting their - UTC offsets (obtained from ``self.utcoffset()``). In order to stop mixed-type - comparisons from falling back to the default comparison by object address, when - a :class:`time` object is compared to an object of a different type, - :exc:`TypeError` is raised unless the comparison is ``==`` or ``!=``. The - latter cases return :const:`False` or :const:`True`, respectively. + the same :attr:`tzinfo` attribute, the common :attr:`tzinfo` attribute is + ignored and the base times are compared. If both comparands are aware and + have different :attr:`tzinfo` attributes, the comparands are first adjusted by + subtracting their UTC offsets (obtained from ``self.utcoffset()``). In order + to stop mixed-type comparisons from falling back to the default comparison by + object address, when a :class:`time` object is compared to an object of a + different type, :exc:`TypeError` is raised unless the comparison is ``==`` or + ``!=``. The latter cases return :const:`False` or :const:`True`, respectively. * hash, use as dict key @@ -1266,10 +1267,10 @@ Instance methods: .. method:: time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]) - Return a :class:`time` with the same value, except for those members given new - values by whichever keyword arguments are specified. Note that ``tzinfo=None`` - can be specified to create a naive :class:`time` from an aware :class:`time`, - without conversion of the time members. + Return a :class:`time` with the same value, except for those attributes given + new values by whichever keyword arguments are specified. Note that + ``tzinfo=None`` can be specified to create a naive :class:`time` from an + aware :class:`time`, without conversion of the time attributes. .. method:: time.isoformat() @@ -1354,7 +1355,7 @@ EDT. An instance of (a concrete subclass of) :class:`tzinfo` can be passed to the constructors for :class:`datetime` and :class:`time` objects. The latter objects -view their members as being in local time, and the :class:`tzinfo` object +view their attributes as being in local time, and the :class:`tzinfo` object supports methods revealing offset of local time from UTC, the name of the time zone, and DST offset, all relative to a date or time object passed to them. @@ -1399,9 +1400,9 @@ methods. Exactly which methods are needed depends on the uses made of aware already been added to the UTC offset returned by :meth:`utcoffset`, so there's no need to consult :meth:`dst` unless you're interested in obtaining DST info separately. For example, :meth:`datetime.timetuple` calls its :attr:`tzinfo` - member's :meth:`dst` method to determine how the :attr:`tm_isdst` flag should be - set, and :meth:`tzinfo.fromutc` calls :meth:`dst` to account for DST changes - when crossing time zones. + attribute's :meth:`dst` method to determine how the :attr:`tm_isdst` flag + should be set, and :meth:`tzinfo.fromutc` calls :meth:`dst` to account for + DST changes when crossing time zones. An instance *tz* of a :class:`tzinfo` subclass that models both standard and daylight times must be consistent in this sense: @@ -1477,10 +1478,10 @@ There is one more :class:`tzinfo` method that a subclass may wish to override: .. method:: tzinfo.fromutc(dt) This is called from the default :class:`datetime.astimezone()` implementation. - When called from that, ``dt.tzinfo`` is *self*, and *dt*'s date and time members - are to be viewed as expressing a UTC time. The purpose of :meth:`fromutc` is to - adjust the date and time members, returning an equivalent datetime in *self*'s - local time. + When called from that, ``dt.tzinfo`` is *self*, and *dt*'s date and time + attributes are to be viewed as expressing a UTC time. The purpose of + :meth:`fromutc` is to adjust the date and time attributes, returning an + equivalent datetime in *self*'s local time. Most :class:`tzinfo` subclasses should be able to inherit the default :meth:`fromutc` implementation without problems. It's strong enough to handle diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst index 9d5b32f..d6cd504 100644 --- a/Doc/library/decimal.rst +++ b/Doc/library/decimal.rst @@ -654,7 +654,7 @@ Decimal objects Normalize the number by stripping the rightmost trailing zeros and converting any result equal to :const:`Decimal('0')` to - :const:`Decimal('0e0')`. Used for producing canonical values for members + :const:`Decimal('0e0')`. Used for producing canonical values for attributes of an equivalence class. For example, ``Decimal('32.100')`` and ``Decimal('0.321000e+2')`` both normalize to the equivalent value ``Decimal('32.1')``. diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index 29fbd64..cdd6c26 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -1127,11 +1127,10 @@ DocTest Objects .. class:: DocTest(examples, globs, name, filename, lineno, docstring) A collection of doctest examples that should be run in a single namespace. The - constructor arguments are used to initialize the member variables of the same - names. + constructor arguments are used to initialize the attributes of the same names. - :class:`DocTest` defines the following member variables. They are initialized by + :class:`DocTest` defines the following attributes. They are initialized by the constructor, and should not be modified directly. @@ -1184,11 +1183,11 @@ Example Objects .. class:: Example(source, want, exc_msg=None, lineno=0, indent=0, options=None) A single interactive example, consisting of a Python statement and its expected - output. The constructor arguments are used to initialize the member variables - of the same names. + output. The constructor arguments are used to initialize the attributes of + the same names. - :class:`Example` defines the following member variables. They are initialized by + :class:`Example` defines the following attributes. They are initialized by the constructor, and should not be modified directly. @@ -1675,9 +1674,9 @@ There are two exceptions that may be raised by :class:`DebugRunner` instances: An exception raised by :class:`DocTestRunner` to signal that a doctest example's actual output did not match its expected output. The constructor arguments are - used to initialize the member variables of the same names. + used to initialize the attributes of the same names. -:exc:`DocTestFailure` defines the following member variables: +:exc:`DocTestFailure` defines the following attributes: .. attribute:: DocTestFailure.test @@ -1699,9 +1698,9 @@ There are two exceptions that may be raised by :class:`DebugRunner` instances: An exception raised by :class:`DocTestRunner` to signal that a doctest example raised an unexpected exception. The constructor arguments are used - to initialize the member variables of the same names. + to initialize the attributes of the same names. -:exc:`UnexpectedException` defines the following member variables: +:exc:`UnexpectedException` defines the following attributes: .. attribute:: UnexpectedException.test diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst index 659a027..48a8694 100644 --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -61,7 +61,7 @@ The module defines the following items: time is used. This module ignores the timestamp when decompressing; however, some programs, such as :program:`gunzip`\ , make use of it. The format of the timestamp is the same as that of the return value of - ``time.time()`` and of the ``st_mtime`` member of the object returned + ``time.time()`` and of the ``st_mtime`` attribute of the object returned by ``os.stat()``. Calling a :class:`GzipFile` object's :meth:`close` method does not close diff --git a/Doc/library/html.entities.rst b/Doc/library/html.entities.rst index 239ae50..b8b4aa8 100644 --- a/Doc/library/html.entities.rst +++ b/Doc/library/html.entities.rst @@ -11,7 +11,7 @@ This module defines three dictionaries, ``name2codepoint``, ``codepoint2name``, and ``entitydefs``. ``entitydefs`` is used to provide the :attr:`entitydefs` -member of the :class:`html.parser.HTMLParser` class. The definition provided +attribute of the :class:`html.parser.HTMLParser` class. The definition provided here contains all the entities defined by XHTML 1.0 that can be handled using simple textual substitution in the Latin-1 character set (ISO-8859-1). diff --git a/Doc/library/http.cookies.rst b/Doc/library/http.cookies.rst index d8a437b..6baf28e 100644 --- a/Doc/library/http.cookies.rst +++ b/Doc/library/http.cookies.rst @@ -152,7 +152,7 @@ Morsel Objects .. method:: Morsel.set(key, value, coded_value) - Set the *key*, *value* and *coded_value* members. + Set the *key*, *value* and *coded_value* attributes. .. method:: Morsel.isReservedKey(K) diff --git a/Doc/library/io.rst b/Doc/library/io.rst index 0584b70..0d87305 100644 --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -391,8 +391,8 @@ I/O Base Classes :class:`RawIOBase` implementation, but wrap one, like :class:`BufferedWriter` and :class:`BufferedReader` do. - :class:`BufferedIOBase` provides or overrides these members in addition to - those from :class:`IOBase`: + :class:`BufferedIOBase` provides or overrides these methods and attribute in + addition to those from :class:`IOBase`: .. attribute:: raw diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst index 164f149..ef507e1 100644 --- a/Doc/library/nntplib.rst +++ b/Doc/library/nntplib.rst @@ -394,7 +394,7 @@ tuples or objects that the method normally returns will be empty. Send an ``ARTICLE`` command, where *message_spec* has the same meaning as for :meth:`stat`. Return a tuple ``(response, info)`` where *info* - is a :class:`~collections.namedtuple` with three members *number*, + is a :class:`~collections.namedtuple` with three attributes *number*, *message_id* and *lines* (in that order). *number* is the article number in the group (or 0 if the information is not available), *message_id* the message id as a string, and *lines* a list of lines (without terminating diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 3d370a0..c412ee1 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1339,11 +1339,12 @@ Files and Directories .. note:: - The exact meaning and resolution of the :attr:`st_atime`, :attr:`st_mtime`, and - :attr:`st_ctime` members depends on the operating system and the file system. - For example, on Windows systems using the FAT or FAT32 file systems, - :attr:`st_mtime` has 2-second resolution, and :attr:`st_atime` has only 1-day - resolution. See your operating system documentation for details. + The exact meaning and resolution of the :attr:`st_atime`, + :attr:`st_mtime`, and :attr:`st_ctime` attributes depend on the operating + system and the file system. For example, on Windows systems using the FAT + or FAT32 file systems, :attr:`st_mtime` has 2-second resolution, and + :attr:`st_atime` has only 1-day resolution. See your operating system + documentation for details. For backward compatibility, the return value of :func:`~os.stat` is also accessible as a tuple of at least 10 integers giving the most important (and portable) @@ -1581,8 +1582,9 @@ to be ignored. Generate a :const:`SIGABRT` signal to the current process. On Unix, the default behavior is to produce a core dump; on Windows, the process immediately returns - an exit code of ``3``. Be aware that programs which use :func:`signal.signal` - to register a handler for :const:`SIGABRT` will behave differently. + an exit code of ``3``. Be aware that calling this function will not call the + Python signal handler registered for :const:`SIGABRT` with + :func:`signal.signal`. Availability: Unix, Windows. diff --git a/Doc/library/pyclbr.rst b/Doc/library/pyclbr.rst index d4a76a6..13eaabf 100644 --- a/Doc/library/pyclbr.rst +++ b/Doc/library/pyclbr.rst @@ -45,7 +45,7 @@ Class Objects The :class:`Class` objects used as values in the dictionary returned by :func:`readmodule` and :func:`readmodule_ex` provide the following data -members: +attributes: .. attribute:: Class.module @@ -89,7 +89,7 @@ Function Objects ---------------- The :class:`Function` objects used as values in the dictionary returned by -:func:`readmodule_ex` provide the following data members: +:func:`readmodule_ex` provide the following attributes: .. attribute:: Function.module diff --git a/Doc/library/reprlib.rst b/Doc/library/reprlib.rst index 0e870da..24a8e52 100644 --- a/Doc/library/reprlib.rst +++ b/Doc/library/reprlib.rst @@ -66,7 +66,7 @@ string instead. Repr Objects ------------ -:class:`Repr` instances provide several members which can be used to provide +:class:`Repr` instances provide several attributes which can be used to provide size limits for the representations of different object types, and methods which format specific object types. diff --git a/Doc/library/shlex.rst b/Doc/library/shlex.rst index 03c9f98..0113fb7 100644 --- a/Doc/library/shlex.rst +++ b/Doc/library/shlex.rst @@ -24,8 +24,8 @@ The :mod:`shlex` module defines the following functions: Split the string *s* using shell-like syntax. If *comments* is :const:`False` (the default), the parsing of comments in the given string will be disabled - (setting the :attr:`commenters` member of the :class:`shlex` instance to the - empty string). This function operates in POSIX mode by default, but uses + (setting the :attr:`commenters` attribute of the :class:`shlex` instance to + the empty string). This function operates in POSIX mode by default, but uses non-POSIX mode if the *posix* argument is false. .. note:: @@ -44,7 +44,7 @@ The :mod:`shlex` module defines the following class: from. It must be a file-/stream-like object with :meth:`read` and :meth:`readline` methods, or a string. If no argument is given, input will be taken from ``sys.stdin``. The second optional argument is a filename - string, which sets the initial value of the :attr:`infile` member. If the + string, which sets the initial value of the :attr:`infile` attribute. If the *instream* argument is omitted or equal to ``sys.stdin``, this second argument defaults to "stdin". The *posix* argument defines the operational mode: when *posix* is not true (default), the :class:`shlex` instance will @@ -202,8 +202,8 @@ either control lexical analysis or can be used for debugging: .. attribute:: shlex.source - This member is ``None`` by default. If you assign a string to it, that string - will be recognized as a lexical-level inclusion request similar to the + This attribute is ``None`` by default. If you assign a string to it, that + string will be recognized as a lexical-level inclusion request similar to the ``source`` keyword in various shells. That is, the immediately following token will opened as a filename and input taken from that stream until EOF, at which point the :meth:`close` method of that stream will be called and the input @@ -213,7 +213,7 @@ either control lexical analysis or can be used for debugging: .. attribute:: shlex.debug - If this member is numeric and ``1`` or more, a :class:`shlex` instance will + If this attribute is numeric and ``1`` or more, a :class:`shlex` instance will print verbose progress output on its behavior. If you need to use this, you can read the module source code to learn the details. diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst index ed547f5e..1d151a7 100644 --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -81,7 +81,7 @@ a threading UDP server class is created as follows:: class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass The mix-in class must come first, since it overrides a method defined in -:class:`UDPServer`. Setting the various member variables also changes the +:class:`UDPServer`. Setting the various attributes also change the behavior of the underlying server mechanism. To implement a service, you must derive a class from :class:`BaseRequestHandler` diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 7367674..32ae724 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -599,43 +599,43 @@ Row Objects Let's assume we initialize a table as in the example given above:: - conn = sqlite3.connect(":memory:") - c = conn.cursor() - c.execute('''create table stocks - (date text, trans text, symbol text, - qty real, price real)''') - c.execute("""insert into stocks - values ('2006-01-05','BUY','RHAT',100,35.14)""") - conn.commit() - c.close() + conn = sqlite3.connect(":memory:") + c = conn.cursor() + c.execute('''create table stocks + (date text, trans text, symbol text, + qty real, price real)''') + c.execute("""insert into stocks + values ('2006-01-05','BUY','RHAT',100,35.14)""") + conn.commit() + c.close() Now we plug :class:`Row` in:: - >>> conn.row_factory = sqlite3.Row - >>> c = conn.cursor() - >>> c.execute('select * from stocks') - <sqlite3.Cursor object at 0x7f4e7dd8fa80> - >>> r = c.fetchone() - >>> type(r) - <class 'sqlite3.Row'> - >>> tuple(r) - ('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14) - >>> len(r) - 5 - >>> r[2] - 'RHAT' - >>> r.keys() - ['date', 'trans', 'symbol', 'qty', 'price'] - >>> r['qty'] - 100.0 - >>> for member in r: - ... print(member) - ... - 2006-01-05 - BUY - RHAT - 100.0 - 35.14 + >>> conn.row_factory = sqlite3.Row + >>> c = conn.cursor() + >>> c.execute('select * from stocks') + <sqlite3.Cursor object at 0x7f4e7dd8fa80> + >>> r = c.fetchone() + >>> type(r) + <class 'sqlite3.Row'> + >>> tuple(r) + ('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14) + >>> len(r) + 5 + >>> r[2] + 'RHAT' + >>> r.keys() + ['date', 'trans', 'symbol', 'qty', 'price'] + >>> r['qty'] + 100.0 + >>> for member in r: + ... print(member) + ... + 2006-01-05 + BUY + RHAT + 100.0 + 35.14 .. _sqlite3-types: @@ -886,6 +886,7 @@ only makes sense to call from a different thread. .. rubric:: Footnotes .. [#f1] The sqlite3 module is not built with loadable extension support by - default, because some platforms (notably Mac OS X) have SQLite libraries which - are compiled without this feature. To get loadable extension support, you must - pass --enable-loadable-sqlite-extensions to configure. + default, because some platforms (notably Mac OS X) have SQLite + libraries which are compiled without this feature. To get loadable + extension support, you must pass --enable-loadable-sqlite-extensions to + configure. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index e24c450..f0933a5 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2567,7 +2567,7 @@ statement is not, strictly speaking, an operation on a module object; ``import foo`` does not require a module object named *foo* to exist, rather it requires an (external) *definition* for a module named *foo* somewhere.) -A special member of every module is :attr:`__dict__`. This is the dictionary +A special attribute of every module is :attr:`__dict__`. This is the dictionary containing the module's symbol table. Modifying this dictionary will actually change the module's symbol table, but direct assignment to the :attr:`__dict__` attribute is not possible (you can write ``m.__dict__['a'] = 1``, which defines diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 4c0edb3..16c2605 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -497,38 +497,39 @@ on Windows. .. attribute:: dwFlags - A bit field that determines whether certain :class:`STARTUPINFO` members - are used when the process creates a window. :: + A bit field that determines whether certain :class:`STARTUPINFO` + attributes are used when the process creates a window. :: si = subprocess.STARTUPINFO() si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW .. attribute:: hStdInput - If :attr:`dwFlags` specifies :data:`STARTF_USESTDHANDLES`, this member is - the standard input handle for the process. If :data:`STARTF_USESTDHANDLES` - is not specified, the default for standard input is the keyboard buffer. + If :attr:`dwFlags` specifies :data:`STARTF_USESTDHANDLES`, this attribute + is the standard input handle for the process. If + :data:`STARTF_USESTDHANDLES` is not specified, the default for standard + input is the keyboard buffer. .. attribute:: hStdOutput - If :attr:`dwFlags` specifies :data:`STARTF_USESTDHANDLES`, this member is - the standard output handle for the process. Otherwise, this member is - ignored and the default for standard output is the console window's + If :attr:`dwFlags` specifies :data:`STARTF_USESTDHANDLES`, this attribute + is the standard output handle for the process. Otherwise, this attribute + is ignored and the default for standard output is the console window's buffer. .. attribute:: hStdError - If :attr:`dwFlags` specifies :data:`STARTF_USESTDHANDLES`, this member is - the standard error handle for the process. Otherwise, this member is + If :attr:`dwFlags` specifies :data:`STARTF_USESTDHANDLES`, this attribute + is the standard error handle for the process. Otherwise, this attribute is ignored and the default for standard error is the console window's buffer. .. attribute:: wShowWindow - If :attr:`dwFlags` specifies :data:`STARTF_USESHOWWINDOW`, this member + If :attr:`dwFlags` specifies :data:`STARTF_USESHOWWINDOW`, this attribute can be any of the values that can be specified in the ``nCmdShow`` parameter for the `ShowWindow <http://msdn.microsoft.com/en-us/library/ms633548(v=vs.85).aspx>`__ - function, except for ``SW_SHOWDEFAULT``. Otherwise, this member is + function, except for ``SW_SHOWDEFAULT``. Otherwise, this attribute is ignored. :data:`SW_HIDE` is provided for this attribute. It is used when @@ -562,12 +563,12 @@ The :mod:`subprocess` module exposes the following constants. .. data:: STARTF_USESTDHANDLES Specifies that the :attr:`STARTUPINFO.hStdInput`, - :attr:`STARTUPINFO.hStdOutput`, and :attr:`STARTUPINFO.hStdError` members + :attr:`STARTUPINFO.hStdOutput`, and :attr:`STARTUPINFO.hStdError` attributes contain additional information. .. data:: STARTF_USESHOWWINDOW - Specifies that the :attr:`STARTUPINFO.wShowWindow` member contains + Specifies that the :attr:`STARTUPINFO.wShowWindow` attribute contains additional information. .. data:: CREATE_NEW_CONSOLE diff --git a/Doc/library/tempfile.rst b/Doc/library/tempfile.rst index 01092fc..fff6c4e 100644 --- a/Doc/library/tempfile.rst +++ b/Doc/library/tempfile.rst @@ -60,7 +60,7 @@ The module defines the following user-callable items: This function operates exactly as :func:`TemporaryFile` does, except that the file is guaranteed to have a visible name in the file system (on Unix, the directory entry is not unlinked). That name can be retrieved - from the :attr:`name` member of the file object. Whether the name can be + from the :attr:`name` attribute of the file object. Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot on Windows NT or later). If *delete* is true (the default), the file is @@ -96,7 +96,7 @@ The module defines the following user-callable items: of the temporary directory object), the newly created temporary directory and all its contents are removed from the filesystem. - The directory name can be retrieved from the :attr:`name` member + The directory name can be retrieved from the :attr:`name` attribute of the returned object. The directory can be explicitly cleaned up by calling the diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index 3e24956..2cd0620 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -105,7 +105,7 @@ The :mod:`urllib.request` module defines the following functions: can be imported), :class:`HTTPSHandler` will also be added. A :class:`BaseHandler` subclass may also change its :attr:`handler_order` - member variable to modify its position in the handlers list. + attribute to modify its position in the handlers list. .. function:: pathname2url(path) @@ -536,7 +536,7 @@ intended for direct use: Remove any parents. -The following members and methods should only be used by classes derived from +The following attribute and methods should only be used by classes derived from :class:`BaseHandler`. .. note:: diff --git a/Doc/library/xdrlib.rst b/Doc/library/xdrlib.rst index 1d3da0a..5c7dfa4 100644 --- a/Doc/library/xdrlib.rst +++ b/Doc/library/xdrlib.rst @@ -260,7 +260,7 @@ Exceptions in this module are coded as class instances: .. exception:: Error - The base exception class. :exc:`Error` has a single public data member + The base exception class. :exc:`Error` has a single public attribute :attr:`msg` containing the description of the error. diff --git a/Doc/library/xmlrpc.client.rst b/Doc/library/xmlrpc.client.rst index a62021d..bb058df 100644 --- a/Doc/library/xmlrpc.client.rst +++ b/Doc/library/xmlrpc.client.rst @@ -136,7 +136,7 @@ returning a value, which may be either returned data in a conformant type or a :class:`Fault` or :class:`ProtocolError` object indicating an error. Servers that support the XML introspection API support some common methods -grouped under the reserved :attr:`system` member: +grouped under the reserved :attr:`system` attribute: .. method:: ServerProxy.system.listMethods() @@ -310,7 +310,7 @@ Fault Objects ------------- A :class:`Fault` object encapsulates the content of an XML-RPC fault tag. Fault -objects have the following members: +objects have the following attributes: .. attribute:: Fault.faultCode @@ -359,7 +359,7 @@ ProtocolError Objects A :class:`ProtocolError` object describes a protocol error in the underlying transport layer (such as a 404 'not found' error if the server named by the URI -does not exist). It has the following members: +does not exist). It has the following attributes: .. attribute:: ProtocolError.url diff --git a/Doc/whatsnew/2.5.rst b/Doc/whatsnew/2.5.rst index 79d8ad2..ff599c8 100644 --- a/Doc/whatsnew/2.5.rst +++ b/Doc/whatsnew/2.5.rst @@ -1459,7 +1459,7 @@ complete list of changes, or look through the SVN logs for all the details. On FreeBSD, the :func:`os.stat` function now returns times with nanosecond resolution, and the returned object now has :attr:`st_gen` and - :attr:`st_birthtime`. The :attr:`st_flags` member is also available, if the + :attr:`st_birthtime`. The :attr:`st_flags` attribute is also available, if the platform supports it. (Contributed by Antti Louko and Diego Pettenò.) .. (Patch 1180695, 1212117) diff --git a/Lib/glob.py b/Lib/glob.py index c5f5f69..36d493d 100644 --- a/Lib/glob.py +++ b/Lib/glob.py @@ -1,6 +1,5 @@ """Filename globbing utility.""" -import sys import os import re import fnmatch diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 1619446..aa4b6d5 100755 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -256,20 +256,18 @@ class ErrorDuringImport(Exception): def importfile(path): """Import a Python source file or compiled file given its path.""" magic = imp.get_magic() - file = open(path, 'r') - if file.read(len(magic)) == magic: - kind = imp.PY_COMPILED - else: - kind = imp.PY_SOURCE - file.close() - filename = os.path.basename(path) - name, ext = os.path.splitext(filename) - file = open(path, 'r') - try: - module = imp.load_module(name, file, path, (ext, 'r', kind)) - except: - raise ErrorDuringImport(path, sys.exc_info()) - file.close() + with open(path, 'rb') as file: + if file.read(len(magic)) == magic: + kind = imp.PY_COMPILED + else: + kind = imp.PY_SOURCE + file.seek(0) + filename = os.path.basename(path) + name, ext = os.path.splitext(filename) + try: + module = imp.load_module(name, file, path, (ext, 'r', kind)) + except: + raise ErrorDuringImport(path, sys.exc_info()) return module def safeimport(path, forceload=0, cache={}): @@ -2582,7 +2580,7 @@ def _url_handler(url, content_type="text/html"): def html_getfile(path): """Get and display a source file listing safely.""" path = path.replace('%20', ' ') - with open(path, 'r') as fp: + with tokenize.open(path) as fp: lines = html.escape(fp.read()) body = '<pre>%s</pre>' % lines heading = html.heading( diff --git a/Lib/runpy.py b/Lib/runpy.py index 4738df3..31e5e55 100644 --- a/Lib/runpy.py +++ b/Lib/runpy.py @@ -226,7 +226,7 @@ def _get_code_from_file(fname): code = read_code(f) if code is None: # That didn't work, so try it as normal source code - with open(fname, "rU") as f: + with open(fname, "rb") as f: code = compile(f.read(), fname, 'exec') return code @@ -77,6 +77,8 @@ from _ssl import ( ) from _ssl import HAS_SNI from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +from _ssl import _OPENSSL_API_VERSION + _PROTOCOL_NAMES = { PROTOCOL_TLSv1: "TLSv1", PROTOCOL_SSLv23: "SSLv23", diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 06285e9..0523219 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -450,7 +450,7 @@ def _eintr_retry_call(func, *args): while True: try: return func(*args) - except OSError as e: + except (OSError, IOError) as e: if e.errno == errno.EINTR: continue raise @@ -804,10 +804,10 @@ class Popen(object): raise self.stdin.close() elif self.stdout: - stdout = self.stdout.read() + stdout = _eintr_retry_call(self.stdout.read) self.stdout.close() elif self.stderr: - stderr = self.stderr.read() + stderr = _eintr_retry_call(self.stderr.read) self.stderr.close() self.wait() return (stdout, stderr) diff --git a/Lib/test/data/README b/Lib/test/data/README index 8bf8c9b..bd05984 100644 --- a/Lib/test/data/README +++ b/Lib/test/data/README @@ -1,2 +1,2 @@ This empty directory serves as destination for temporary files -created by some tests. +created by some tests, in particular, the test_codecmaps_* tests. diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 76f4249..46ddc82 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -566,6 +566,33 @@ class ExceptionTests(unittest.TestCase): del g self.assertEqual(sys.exc_info()[0], TypeError) + def test_generator_leaking2(self): + # See issue 12475. + def g(): + yield + try: + raise RuntimeError + except RuntimeError: + it = g() + next(it) + try: + next(it) + except StopIteration: + pass + self.assertEqual(sys.exc_info(), (None, None, None)) + + def test_generator_doesnt_retain_old_exc(self): + def g(): + self.assertIsInstance(sys.exc_info()[1], RuntimeError) + yield + self.assertEqual(sys.exc_info(), (None, None, None)) + it = g() + try: + raise RuntimeError + except RuntimeError: + next(it) + self.assertRaises(StopIteration, next, it) + def test_generator_finalizing_and_exc_info(self): # See #7173 def simple_gen(): diff --git a/Lib/test/test_robotparser.py b/Lib/test/test_robotparser.py index 2a6d047..178761d 100644 --- a/Lib/test/test_robotparser.py +++ b/Lib/test/test_robotparser.py @@ -1,7 +1,8 @@ import io import unittest import urllib.robotparser -from urllib.error import URLError +from urllib.error import URLError, HTTPError +from urllib.request import urlopen from test import support class RobotTestCase(unittest.TestCase): @@ -237,13 +238,27 @@ class NetworkTestCase(unittest.TestCase): support.requires('network') with support.transient_internet('mueblesmoraleda.com'): url = 'http://mueblesmoraleda.com' + robots_url = url + "/robots.txt" + # First check the URL is usable for our purposes, since the + # test site is a bit flaky. + try: + urlopen(robots_url) + except HTTPError as e: + if e.code not in {401, 403}: + self.skipTest( + "%r should return a 401 or 403 HTTP error, not %r" + % (robots_url, e.code)) + else: + self.skipTest( + "%r should return a 401 or 403 HTTP error, not succeed" + % (robots_url)) parser = urllib.robotparser.RobotFileParser() parser.set_url(url) try: parser.read() except URLError: self.skipTest('%s is unavailable' % url) - self.assertEqual(parser.can_fetch("*", url+"/robots.txt"), False) + self.assertEqual(parser.can_fetch("*", robots_url), False) def testPythonOrg(self): support.requires('network') diff --git a/Lib/test/test_runpy.py b/Lib/test/test_runpy.py index ad3ab39..7ffb6af 100644 --- a/Lib/test/test_runpy.py +++ b/Lib/test/test_runpy.py @@ -405,6 +405,16 @@ argv0 = sys.argv[0] msg = "recursion depth exceeded" self.assertRaisesRegex(RuntimeError, msg, run_path, zip_name) + def test_encoding(self): + with temp_dir() as script_dir: + filename = os.path.join(script_dir, 'script.py') + with open(filename, 'w', encoding='latin1') as f: + f.write(""" +#coding:latin1 +"non-ASCII: h\xe9" +""") + result = run_path(filename) + self.assertEqual(result['__doc__'], "non-ASCII: h\xe9") def test_main(): diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index ede6545..8df1bf0 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -11,7 +11,7 @@ import traceback import unittest from test import support from contextlib import closing -from test.script_helper import spawn_python +from test.script_helper import assert_python_ok, spawn_python if sys.platform in ('os2', 'riscos'): raise unittest.SkipTest("Can't test signal on %s" % sys.platform) @@ -233,49 +233,80 @@ class WindowsSignalTests(unittest.TestCase): @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") class WakeupSignalTests(unittest.TestCase): - TIMEOUT_FULL = 10 - TIMEOUT_HALF = 5 + def check_wakeup(self, test_body): + # use a subprocess to have only one thread and to not change signal + # handling of the parent process + code = """if 1: + import fcntl + import os + import signal + + def handler(signum, frame): + pass + + {} + + signal.signal(signal.SIGALRM, handler) + read, write = os.pipe() + flags = fcntl.fcntl(write, fcntl.F_GETFL, 0) + flags = flags | os.O_NONBLOCK + fcntl.fcntl(write, fcntl.F_SETFL, flags) + signal.set_wakeup_fd(write) + + test() + + os.close(read) + os.close(write) + """.format(test_body) + + assert_python_ok('-c', code) def test_wakeup_fd_early(self): - import select - - signal.alarm(1) - before_time = time.time() - # We attempt to get a signal during the sleep, - # before select is called - time.sleep(self.TIMEOUT_FULL) - mid_time = time.time() - self.assertTrue(mid_time - before_time < self.TIMEOUT_HALF) - select.select([self.read], [], [], self.TIMEOUT_FULL) - after_time = time.time() - self.assertTrue(after_time - mid_time < self.TIMEOUT_HALF) + self.check_wakeup("""def test(): + import select + import time - def test_wakeup_fd_during(self): - import select + TIMEOUT_FULL = 10 + TIMEOUT_HALF = 5 - signal.alarm(1) - before_time = time.time() - # We attempt to get a signal during the select call - self.assertRaises(select.error, select.select, - [self.read], [], [], self.TIMEOUT_FULL) - after_time = time.time() - self.assertTrue(after_time - before_time < self.TIMEOUT_HALF) + signal.alarm(1) + before_time = time.time() + # We attempt to get a signal during the sleep, + # before select is called + time.sleep(TIMEOUT_FULL) + mid_time = time.time() + dt = mid_time - before_time + if dt >= TIMEOUT_HALF: + raise Exception("%s >= %s" % (dt, TIMEOUT_HALF)) + select.select([read], [], [], TIMEOUT_FULL) + after_time = time.time() + dt = after_time - mid_time + if dt >= TIMEOUT_HALF: + raise Exception("%s >= %s" % (dt, TIMEOUT_HALF)) + """) - def setUp(self): - import fcntl + def test_wakeup_fd_during(self): + self.check_wakeup("""def test(): + import select + import time - self.alrm = signal.signal(signal.SIGALRM, lambda x,y:None) - self.read, self.write = os.pipe() - flags = fcntl.fcntl(self.write, fcntl.F_GETFL, 0) - flags = flags | os.O_NONBLOCK - fcntl.fcntl(self.write, fcntl.F_SETFL, flags) - self.old_wakeup = signal.set_wakeup_fd(self.write) + TIMEOUT_FULL = 10 + TIMEOUT_HALF = 5 - def tearDown(self): - signal.set_wakeup_fd(self.old_wakeup) - os.close(self.read) - os.close(self.write) - signal.signal(signal.SIGALRM, self.alrm) + signal.alarm(1) + before_time = time.time() + # We attempt to get a signal during the select call + try: + select.select([read], [], [], TIMEOUT_FULL) + except select.error: + pass + else: + raise Exception("select.error not raised") + after_time = time.time() + dt = after_time - before_time + if dt >= TIMEOUT_HALF: + raise Exception("%s >= %s" % (dt, TIMEOUT_HALF)) + """) @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") class SiginterruptTest(unittest.TestCase): diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 7edf5b2..869381a 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -60,7 +60,7 @@ def handle_error(prefix): def can_clear_options(): # 0.9.8m or higher - return ssl.OPENSSL_VERSION_INFO >= (0, 9, 8, 13, 15) + return ssl._OPENSSL_API_VERSION >= (0, 9, 8, 13, 15) def no_sslv2_implies_sslv3_hello(): # 0.9.7h or higher diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 4a563b9..08f0ecf 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -675,6 +675,24 @@ class ProcessTestCase(BaseTestCase): time.sleep(2) p.communicate(b"x" * 2**20) + @unittest.skipUnless(hasattr(signal, 'SIGALRM'), + "Requires signal.SIGALRM") + def test_communicate_eintr(self): + # Issue #12493: communicate() should handle EINTR + def handler(signum, frame): + pass + old_handler = signal.signal(signal.SIGALRM, handler) + self.addCleanup(signal.signal, signal.SIGALRM, old_handler) + + # the process is running for 2 seconds + args = [sys.executable, "-c", 'import time; time.sleep(2)'] + for stream in ('stdout', 'stderr'): + kw = {stream: subprocess.PIPE} + with subprocess.Popen(args, **kw) as process: + signal.alarm(1) + # communicate() will be interrupted by SIGALRM + process.communicate() + # context manager class _SuppressCoreFiles(object): diff --git a/Lib/test/test_tk.py b/Lib/test/test_tk.py index ab979fa..f993c53 100644 --- a/Lib/test/test_tk.py +++ b/Lib/test/test_tk.py @@ -2,15 +2,11 @@ from test import support # Skip test if _tkinter wasn't built. support.import_module('_tkinter') -import tkinter -from tkinter.test import runtktests -import unittest +# Skip test if tk cannot be initialized. +from tkinter.test.support import check_tk_availability +check_tk_availability() -try: - tkinter.Button() -except tkinter.TclError as msg: - # assuming tk is not available - raise unittest.SkipTest("tk not available: %s" % msg) +from tkinter.test import runtktests def test_main(enable_gui=False): if enable_gui: diff --git a/Lib/test/test_ttk_guionly.py b/Lib/test/test_ttk_guionly.py index bff4fc1..b8c1a4c 100644 --- a/Lib/test/test_ttk_guionly.py +++ b/Lib/test/test_ttk_guionly.py @@ -5,6 +5,10 @@ from test import support # Skip this test if _tkinter wasn't built. support.import_module('_tkinter') +# Skip test if tk cannot be initialized. +from tkinter.test.support import check_tk_availability +check_tk_availability() + from _tkinter import TclError from tkinter import ttk from tkinter.test import runtktests diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 97be587..885e740 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -788,6 +788,7 @@ class UnicodeTest(string_tests.CommonTest, self.assertEqual('%c' % '\U00021483', '\U00021483') self.assertRaises(TypeError, "%c".__mod__, "aa") self.assertRaises(ValueError, "%.1\u1032f".__mod__, (1.0/3)) + self.assertRaises(TypeError, "%i".__mod__, "aa") # formatting jobs delegated from the string implementation: self.assertEqual('...%(foo)s...' % {'foo':"abc"}, '...abc...') diff --git a/Lib/tkinter/test/support.py b/Lib/tkinter/test/support.py index 97212fb..6dd6d4a 100644 --- a/Lib/tkinter/test/support.py +++ b/Lib/tkinter/test/support.py @@ -1,6 +1,52 @@ +import sys import tkinter +import unittest + +_tk_unavailable = None + +def check_tk_availability(): + """Check that Tk is installed and available.""" + global _tk_unavailable + + if _tk_unavailable is None: + _tk_unavailable = False + if sys.platform == 'darwin': + # The Aqua Tk implementations on OS X can abort the process if + # being called in an environment where a window server connection + # cannot be made, for instance when invoked by a buildbot or ssh + # process not running under the same user id as the current console + # user. To avoid that, raise an exception if the window manager + # connection is not available. + from ctypes import cdll, c_int, pointer, Structure + from ctypes.util import find_library + + app_services = cdll.LoadLibrary(find_library("ApplicationServices")) + + if app_services.CGMainDisplayID() == 0: + _tk_unavailable = "cannot run without OS X window manager" + else: + class ProcessSerialNumber(Structure): + _fields_ = [("highLongOfPSN", c_int), + ("lowLongOfPSN", c_int)] + psn = ProcessSerialNumber() + psn_p = pointer(psn) + if ( (app_services.GetCurrentProcess(psn_p) < 0) or + (app_services.SetFrontProcess(psn_p) < 0) ): + _tk_unavailable = "cannot run without OS X gui process" + else: # not OS X + import tkinter + try: + tkinter.Button() + except tkinter.TclError as msg: + # assuming tk is not available + _tk_unavailable = "tk not available: %s" % msg + + if _tk_unavailable: + raise unittest.SkipTest(_tk_unavailable) + return def get_tk_root(): + check_tk_availability() # raise exception if tk unavailable try: root = tkinter._default_root except AttributeError: diff --git a/Lib/xml/dom/pulldom.py b/Lib/xml/dom/pulldom.py index 81a36b0..d5ac8b2 100644 --- a/Lib/xml/dom/pulldom.py +++ b/Lib/xml/dom/pulldom.py @@ -326,7 +326,7 @@ def parse(stream_or_string, parser=None, bufsize=None): if bufsize is None: bufsize = default_bufsize if isinstance(stream_or_string, str): - stream = open(stream_or_string) + stream = open(stream_or_string, 'rb') else: stream = stream_or_string if not parser: diff --git a/Makefile.pre.in b/Makefile.pre.in index 694faad..dfa7219 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -910,6 +910,7 @@ MACHDEPS= $(PLATDIR) $(EXTRAPLATDIR) XMLLIBSUBDIRS= xml xml/dom xml/etree xml/parsers xml/sax LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \ tkinter/test/test_ttk site-packages test \ + test/capath test/data \ test/cjkencodings test/decimaltestdata test/xmltestdata test/subprocessdata \ test/tracedmodules test/encoded_modules \ concurrent concurrent/futures encodings \ @@ -5,14 +5,67 @@ Python News What's New in Python 3.2.2? =========================== -*Release date: XXXX-XX-XX* +*Release date: XX-XXX-2011* Core and Builtins ----------------- +- Issue #9611, #9015: FileIO.read() clamps the length to INT_MAX on Windows. + +- When a generator yields, do not retain the caller's exception state on the + generator. + +- Issue #12475: Prevent generators from leaking their exception state into the + caller's frame as they return for the last time. + Library ------- +- Issue #12493: subprocess: Popen.communicate() now also handles EINTR errors + if the process has only one pipe. + +- Issue #12451: pydoc: html_getfile() now uses tokenize.open() to support + Python scripts using a encoding different than UTF-8 (read the coding cookie + of the script). + +- Issue #12451: pydoc: importfile() now opens the Python script in binary mode, + instead of text mode using the locale encoding, to avoid encoding issues. + +- Issue #12451: runpy: run_path() now opens the Python script in binary mode, + instead of text mode using the locale encoding, to support other encodings + than UTF-8 (scripts using the coding cookie). + +- Issue #12451: xml.dom.pulldom: parse() now opens files in binary mode instead + of the text mode (using the locale encoding) to avoid encoding issues. + +C-API +----- + +Tests +----- + +- Avoid failing in test_robotparser when mueblesmoraleda.com is flaky and + an overzealous DNS service (e.g. OpenDNS) redirects to a placeholder + Web site. + +- Issue #12440: When testing whether some bits in SSLContext.options can be + reset, check the version of the OpenSSL headers Python was compiled against, + rather than the runtime version of the OpenSSL library. + +- Issue #12497: Install test/data to prevent failures of the various codecmaps + tests. + +- Issue #12496: Install test/capath directory to prevent test_connect_capath + testcase failure in test_ssl. + +- Issue #12469: Run "wakeup" signal tests in subprocess to run the test in a + fresh process with only one thread and to not change signal handling of the + parent process. + +- Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run + test_tk or test_ttk_guionly under a username that is not currently logged + in to the console windowserver (as may be the case under buildbot or ssh). + What's New in Python 3.2.1? =========================== @@ -876,7 +929,7 @@ Core and Builtins (length bigger than 2^31-1 bytes). - Issue #9015, #9611: FileIO.readinto(), FileIO.write(), os.write() and - stdprinter.write() clamp the length to 2^31-1 on Windows. + stdprinter.write() clamp the length to INT_MAX on Windows. - Issue #8278: On Windows and with a NTFS filesystem, os.stat() and os.utime() can now handle dates after 2038. diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index 141b6de..b1d492b 100644 --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -664,6 +664,10 @@ fileio_read(fileio *self, PyObject *args) return fileio_readall(self); } +#if defined(MS_WIN64) || defined(MS_WINDOWS) + if (size > INT_MAX) + size = INT_MAX; +#endif bytes = PyBytes_FromStringAndSize(NULL, size); if (bytes == NULL) return NULL; @@ -672,7 +676,11 @@ fileio_read(fileio *self, PyObject *args) if (_PyVerify_fd(self->fd)) { Py_BEGIN_ALLOW_THREADS errno = 0; +#if defined(MS_WIN64) || defined(MS_WINDOWS) + n = read(self->fd, ptr, (int)size); +#else n = read(self->fd, ptr, size); +#endif Py_END_ALLOW_THREADS } else n = -1; diff --git a/Modules/_ssl.c b/Modules/_ssl.c index a813d5f..27dcdbc 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -2037,6 +2037,24 @@ static struct PyModuleDef _sslmodule = { NULL }; + +static void +parse_openssl_version(unsigned long libver, + unsigned int *major, unsigned int *minor, + unsigned int *fix, unsigned int *patch, + unsigned int *status) +{ + *status = libver & 0xF; + libver >>= 4; + *patch = libver & 0xFF; + libver >>= 8; + *fix = libver & 0xFF; + libver >>= 8; + *minor = libver & 0xFF; + libver >>= 8; + *major = libver & 0xFF; +} + PyMODINIT_FUNC PyInit__ssl(void) { @@ -2149,15 +2167,7 @@ PyInit__ssl(void) return NULL; if (PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r)) return NULL; - status = libver & 0xF; - libver >>= 4; - patch = libver & 0xFF; - libver >>= 8; - fix = libver & 0xFF; - libver >>= 8; - minor = libver & 0xFF; - libver >>= 8; - major = libver & 0xFF; + parse_openssl_version(libver, &major, &minor, &fix, &patch, &status); r = Py_BuildValue("IIIII", major, minor, fix, patch, status); if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r)) return NULL; @@ -2165,5 +2175,11 @@ PyInit__ssl(void) if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r)) return NULL; + libver = OPENSSL_VERSION_NUMBER; + parse_openssl_version(libver, &major, &minor, &fix, &patch, &status); + r = Py_BuildValue("IIIII", major, minor, fix, patch, status); + if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r)) + return NULL; + return m; } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 7a70a5e..03807a4 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9689,8 +9689,6 @@ PyObject *PyUnicode_Format(PyObject *format, case 'o': case 'x': case 'X': - if (c == 'i') - c = 'd'; isnumok = 0; if (PyNumber_Check(v)) { PyObject *iobj=NULL; @@ -9705,7 +9703,7 @@ PyObject *PyUnicode_Format(PyObject *format, if (iobj!=NULL) { if (PyLong_Check(iobj)) { isnumok = 1; - temp = formatlong(iobj, flags, prec, c); + temp = formatlong(iobj, flags, prec, (c == 'i'? 'd': c)); Py_DECREF(iobj); if (!temp) goto onError; diff --git a/Python/_warnings.c b/Python/_warnings.c index 07fd683..615a2d3 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -517,6 +517,7 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, } else { const char *module_str = _PyUnicode_AsString(*module); + *filename = NULL; if (module_str == NULL) goto handle_error; if (strcmp(module_str, "__main__") == 0) { diff --git a/Python/ceval.c b/Python/ceval.c index 705ed41..5c3bb83 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1145,6 +1145,23 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) f->f_exc_traceback = tmp; \ } +#define RESTORE_AND_CLEAR_EXC_STATE() \ + { \ + PyObject *type, *value, *tb; \ + type = tstate->exc_type; \ + value = tstate->exc_value; \ + tb = tstate->exc_traceback; \ + tstate->exc_type = f->f_exc_type; \ + tstate->exc_value = f->f_exc_value; \ + tstate->exc_traceback = f->f_exc_traceback; \ + f->f_exc_type = NULL; \ + f->f_exc_value = NULL; \ + f->f_exc_traceback = NULL; \ + Py_XDECREF(type); \ + Py_XDECREF(value); \ + Py_XDECREF(tb); \ + } + /* Start of code */ if (f == NULL) @@ -1881,10 +1898,6 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) retval = POP(); f->f_stacktop = stack_pointer; why = WHY_YIELD; - /* Put aside the current exception state and restore - that of the calling frame. This only serves when - "yield" is used inside an except handler. */ - SWAP_EXC_STATE(); goto fast_yield; TARGET(POP_EXCEPT) @@ -3021,6 +3034,26 @@ fast_block_end: retval = NULL; fast_yield: + if (co->co_flags & CO_GENERATOR && (why == WHY_YIELD || why == WHY_RETURN)) { + /* The purpose of this block is to put aside the generator's exception + state and restore that of the calling frame. If the current + exception state is from the caller, we clear the exception values + on the generator frame, so they are not swapped back in latter. The + origin of the current exception state is determined by checking for + except handler blocks, which we must be in iff a new exception + state came into existence in this frame. (An uncaught exception + would have why == WHY_EXCEPTION, and we wouldn't be here). */ + int i; + for (i = 0; i < f->f_iblock; i++) + if (f->f_blockstack[i].b_type == EXCEPT_HANDLER) + break; + if (i == f->f_iblock) + /* We did not create this exception. */ + RESTORE_AND_CLEAR_EXC_STATE() + else + SWAP_EXC_STATE() + } + if (tstate->use_tracing) { if (tstate->c_tracefunc) { if (why == WHY_RETURN || why == WHY_YIELD) { |