In [6]: import ast
...: from pathlib import Path
...:
...: def find_realiases(filename):
...: with open(filename) as f:
...: module = ast.parse(f.read())
...: aliases = [node for node in ast.walk(module) if isinstance(node, ast.alias)]
...: realiased = [a for a in aliases if a.asname and a.asname != a.name.split(".")[-1] and not a.asname.startswith("_")]
...: for alias in realiased:
...: relpath = filename.relative_to(Path.home() / "dev/typeshed")
...: print(f"{str(relpath):60} {alias.name} as {alias.asname}")
...:
...:
...: for p in sorted((Path.home() / "dev/typeshed").glob("**/*.pyi")):
...: find_realiases(p)
...:
stdlib/2/collections.pyi AbstractSet as Set
stdlib/2/future_builtins.pyi ifilter as filter
stdlib/2/future_builtins.pyi imap as map
stdlib/2/future_builtins.pyi izip as zip
stdlib/2/md5.pyi md5 as new
stdlib/2/os/__init__.pyi OSError as error
stdlib/2/os/__init__.pyi _PathLike as PathLike
stdlib/2and3/_dummy_threading.pyi _ExceptHookArgs as ExceptHookArgs
stdlib/2and3/contextlib.pyi ContextManager as AbstractContextManager
stdlib/2and3/contextlib.pyi AsyncContextManager as AbstractAsyncContextManager
stdlib/2and3/plistlib.pyi Dict as DictT
stdlib/2and3/threading.pyi _ExceptHookArgs as ExceptHookArgs
stdlib/3/collections/__init__.pyi AbstractSet as Set
stdlib/3/os/__init__.pyi OSError as error
stdlib/3/os/__init__.pyi _PathLike as PathLike
stdlib/3/platform.pyi devnull as DEV_NULL
third_party/2/six/__init__.pyi StringIO as BytesIO
third_party/2/six/moves/__init__.pyi __builtin__ as builtins
third_party/2/six/moves/__init__.pyi raw_input as input
third_party/2/six/moves/__init__.pyi reload as reload_module
third_party/2/six/moves/__init__.pyi xrange as range
third_party/2/six/moves/__init__.pyi StringIO as cStringIO
third_party/2/six/moves/__init__.pyi ifilter as filter
third_party/2/six/moves/__init__.pyi ifilterfalse as filterfalse
third_party/2/six/moves/__init__.pyi imap as map
third_party/2/six/moves/__init__.pyi izip as zip
third_party/2/six/moves/__init__.pyi izip_longest as zip_longest
third_party/2/six/moves/__init__.pyi getcwd as getcwdb
third_party/2/six/moves/__init__.pyi getcwdu as getcwd
third_party/2/six/moves/__init__.pyi quote as shlex_quote
third_party/2/six/moves/urllib/parse.pyi unquote as unquote_to_bytes
third_party/2and3/Crypto/Protocol/KDF.pyi SHA as SHA1
third_party/2and3/boto/compat.pyi encodestring as encodebytes
third_party/2and3/click/types.pyi _ParamType as ParamType
third_party/2and3/dateutil/rrule.pyi weekday as weekdaybase
third_party/2and3/flask/templating.pyi Environment as BaseEnvironment
third_party/2and3/flask/wrappers.pyi Request as RequestBase
third_party/2and3/flask/wrappers.pyi Response as ResponseBase
third_party/2and3/google/protobuf/map_unittest_pb2.pyi ForeignMessage as ForeignMessage1
third_party/2and3/jinja2/_compat.pyi quote_from_bytes as url_quote
third_party/2and3/jinja2/_compat.pyi quote as url_quote
third_party/2and3/jinja2/compiler.pyi iskeyword as is_python_keyword
third_party/2and3/jinja2/defaults.pyi FILTERS as DEFAULT_FILTERS
third_party/2and3/jinja2/defaults.pyi TESTS as DEFAULT_TESTS
third_party/2and3/requests/adapters.pyi exceptions as urllib3_exceptions
third_party/2and3/requests/exceptions.pyi HTTPError as BaseHTTPError
third_party/2and3/requests/models.pyi exceptions as urllib3_exceptions
third_party/2and3/werkzeug/_compat.pyi StringIO as BytesIO
third_party/2and3/werkzeug/_compat.pyi StringIO as BytesIO
third_party/2and3/werkzeug/contrib/securecookie.pyi new as hmac
third_party/2and3/werkzeug/debug/__init__.pyi BaseRequest as Request
third_party/2and3/werkzeug/debug/__init__.pyi BaseResponse as Response
third_party/2and3/werkzeug/test.pyi Request as U2Request
third_party/2and3/werkzeug/test.pyi Request as U2Request
third_party/2and3/werkzeug/testapp.pyi BaseRequest as Request
third_party/2and3/werkzeug/testapp.pyi BaseResponse as Response
third_party/3/aiofiles/__init__.pyi _os as os
third_party/3/six/moves/__init__.pyi range as xrange
third_party/3/six/moves/__init__.pyi reload as reload_module
third_party/3/six/moves/__init__.pyi StringIO as cStringIO
third_party/3/six/moves/__init__.pyi quote as shlex_quote
third_party/3/waitress/compat.pyi parse as urlparse
I just realize there is an ambiguity in PEP 484 regarding the ‘import ... as ...‘ syntax (and the other form).I’ve always interpreted (and intended) this to mean ‘[from ...] import X as X’ (i.e. a redundant ‘as’ clause) and that is how it’s used in typeshed.But it seems you are interpreting it as anything that uses an ‘as’ clause (as in Brett’s ‘dabuiltins’ example). And the text can indeed be read that way.Do we have an indication that others are interpreting it that way? If not, maybe we should amend PEP 484 to clarify this.—Guido----Guido (mobile)_______________________________________________
Typing-sig mailing list -- typing-sig@python.org
To unsubscribe send an email to typing-sig-leave@python.org
https://mail.python.org/mailman3/lists/typing-sig.python.org/
Member address: hauntsaninja@gmail.com