comparison env/lib/python3.9/site-packages/humanfriendly/compat.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4f3585e2f14b
1 # Human friendly input/output in Python.
2 #
3 # Author: Peter Odding <peter@peterodding.com>
4 # Last Change: December 10, 2020
5 # URL: https://humanfriendly.readthedocs.io
6
7 """
8 Compatibility with Python 2 and 3.
9
10 This module exposes aliases and functions that make it easier to write Python
11 code that is compatible with Python 2 and Python 3.
12
13 .. data:: basestring
14
15 Alias for :func:`python2:basestring` (in Python 2) or :class:`python3:str`
16 (in Python 3). See also :func:`is_string()`.
17
18 .. data:: HTMLParser
19
20 Alias for :class:`python2:HTMLParser.HTMLParser` (in Python 2) or
21 :class:`python3:html.parser.HTMLParser` (in Python 3).
22
23 .. data:: interactive_prompt
24
25 Alias for :func:`python2:raw_input()` (in Python 2) or
26 :func:`python3:input()` (in Python 3).
27
28 .. data:: StringIO
29
30 Alias for :class:`python2:StringIO.StringIO` (in Python 2) or
31 :class:`python3:io.StringIO` (in Python 3).
32
33 .. data:: unicode
34
35 Alias for :func:`python2:unicode` (in Python 2) or :class:`python3:str` (in
36 Python 3). See also :func:`coerce_string()`.
37
38 .. data:: monotonic
39
40 Alias for :func:`python3:time.monotonic()` (in Python 3.3 and higher) or
41 `monotonic.monotonic()` (a `conditional dependency
42 <https://pypi.org/project/monotonic/>`_ on older Python versions).
43 """
44
45 __all__ = (
46 'HTMLParser',
47 'StringIO',
48 'basestring',
49 'coerce_string',
50 'interactive_prompt',
51 'is_string',
52 'is_unicode',
53 'monotonic',
54 'name2codepoint',
55 'on_macos',
56 'on_windows',
57 'unichr',
58 'unicode',
59 # This export remains here so as not to break my dozen or so other Python
60 # projects using 'from humanfriendly.compat import unittest' from good old
61 # times (when Python 2.6 was still a thing). It will eventually be removed.
62 'unittest',
63 'which',
64 )
65
66 # Standard library modules.
67 import sys
68 import unittest
69
70 # Differences between Python 2 and 3.
71 try:
72 # Python 2.
73 unicode = unicode
74 unichr = unichr
75 basestring = basestring
76 interactive_prompt = raw_input
77 from distutils.spawn import find_executable as which
78 from HTMLParser import HTMLParser
79 from StringIO import StringIO
80 from htmlentitydefs import name2codepoint
81 except (ImportError, NameError):
82 # Python 3.
83 unicode = str
84 unichr = chr
85 basestring = str
86 interactive_prompt = input
87 from shutil import which
88 from html.parser import HTMLParser
89 from io import StringIO
90 from html.entities import name2codepoint
91
92 try:
93 # Python 3.3 and higher.
94 from time import monotonic
95 except ImportError:
96 # A replacement for older Python versions:
97 # https://pypi.org/project/monotonic/
98 try:
99 from monotonic import monotonic
100 except (ImportError, RuntimeError):
101 # We fall back to the old behavior of using time.time() instead of
102 # failing when {time,monotonic}.monotonic() are both missing.
103 from time import time as monotonic
104
105
106 def coerce_string(value):
107 """
108 Coerce any value to a Unicode string (:func:`python2:unicode` in Python 2 and :class:`python3:str` in Python 3).
109
110 :param value: The value to coerce.
111 :returns: The value coerced to a Unicode string.
112 """
113 return value if is_string(value) else unicode(value)
114
115
116 def is_string(value):
117 """
118 Check if a value is a :func:`python2:basestring` (in Python 2) or :class:`python3:str` (in Python 3) object.
119
120 :param value: The value to check.
121 :returns: :data:`True` if the value is a string, :data:`False` otherwise.
122 """
123 return isinstance(value, basestring)
124
125
126 def is_unicode(value):
127 """
128 Check if a value is a :func:`python2:unicode` (in Python 2) or :class:`python2:str` (in Python 3) object.
129
130 :param value: The value to check.
131 :returns: :data:`True` if the value is a Unicode string, :data:`False` otherwise.
132 """
133 return isinstance(value, unicode)
134
135
136 def on_macos():
137 """
138 Check if we're running on Apple MacOS.
139
140 :returns: :data:`True` if running MacOS, :data:`False` otherwise.
141 """
142 return sys.platform.startswith('darwin')
143
144
145 def on_windows():
146 """
147 Check if we're running on the Microsoft Windows OS.
148
149 :returns: :data:`True` if running Windows, :data:`False` otherwise.
150 """
151 return sys.platform.startswith('win')