gh-125633: Add function `ispackage` to stdlib `inspect` (#125634)

---------

Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
This commit is contained in:
Zhikang Yan 2024-10-27 12:57:43 +08:00 committed by GitHub
parent c51b56038b
commit dad3453129
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 37 additions and 6 deletions

View File

@ -374,6 +374,13 @@ attributes (see :ref:`import-mod-attrs` for module attributes):
Return ``True`` if the object is a bound method written in Python.
.. function:: ispackage(object)
Return ``True`` if the object is a :term:`package`.
.. versionadded:: 3.14
.. function:: isfunction(object)
Return ``True`` if the object is a Python function, which includes functions

View File

@ -326,6 +326,10 @@ inspect
If true, string :term:`annotations <annotation>` are displayed without surrounding quotes.
(Contributed by Jelle Zijlstra in :gh:`101552`.)
* Add function :func:`inspect.ispackage` to determine whether an object is a
:term:`package` or not.
(Contributed by Zhikang Yan in :gh:`125634`.)
json
----

View File

@ -6,9 +6,9 @@ It also provides some help for examining source code and class layout.
Here are some of the useful functions provided by this module:
ismodule(), isclass(), ismethod(), isfunction(), isgeneratorfunction(),
isgenerator(), istraceback(), isframe(), iscode(), isbuiltin(),
isroutine() - check object types
ismodule(), isclass(), ismethod(), ispackage(), isfunction(),
isgeneratorfunction(), isgenerator(), istraceback(), isframe(),
iscode(), isbuiltin(), isroutine() - check object types
getmembers() - get members of an object that satisfy a given condition
getfile(), getsourcefile(), getsource() - find an object's source code
@ -128,6 +128,7 @@ __all__ = [
"ismethoddescriptor",
"ismethodwrapper",
"ismodule",
"ispackage",
"isroutine",
"istraceback",
"markcoroutinefunction",
@ -186,6 +187,10 @@ def ismethod(object):
"""Return true if the object is an instance method."""
return isinstance(object, types.MethodType)
def ispackage(object):
"""Return true if the object is a package."""
return ismodule(object) and hasattr(object, "__path__")
def ismethoddescriptor(object):
"""Return true if the object is a method descriptor.

View File

@ -51,7 +51,7 @@ from test.test_inspect import inspect_deferred_annotations
# Functions tested in this suite:
# ismodule, isclass, ismethod, isfunction, istraceback, isframe, iscode,
# isbuiltin, isroutine, isgenerator, isgeneratorfunction, getmembers,
# isbuiltin, isroutine, isgenerator, ispackage, isgeneratorfunction, getmembers,
# getdoc, getfile, getmodule, getsourcefile, getcomments, getsource,
# getclasstree, getargvalues, formatargvalues, currentframe,
# stack, trace, ismethoddescriptor, isdatadescriptor, ismethodwrapper
@ -105,7 +105,7 @@ unsorted_keyword_only_parameters = 'throw out the baby with_ the_ bathwater'.spl
class IsTestBase(unittest.TestCase):
predicates = set([inspect.isbuiltin, inspect.isclass, inspect.iscode,
inspect.isframe, inspect.isfunction, inspect.ismethod,
inspect.ismodule, inspect.istraceback,
inspect.ismodule, inspect.istraceback, inspect.ispackage,
inspect.isgenerator, inspect.isgeneratorfunction,
inspect.iscoroutine, inspect.iscoroutinefunction,
inspect.isasyncgen, inspect.isasyncgenfunction,
@ -121,6 +121,9 @@ class IsTestBase(unittest.TestCase):
predicate == inspect.iscoroutinefunction) and \
other == inspect.isfunction:
continue
if predicate == inspect.ispackage and other == inspect.ismodule:
self.assertTrue(predicate(obj), '%s(%s)' % (predicate.__name__, exp))
else:
self.assertFalse(other(obj), 'not %s(%s)' % (other.__name__, exp))
def test__all__(self):
@ -201,7 +204,17 @@ class TestPredicates(IsTestBase):
self.assertFalse(inspect.ismethodwrapper(int))
self.assertFalse(inspect.ismethodwrapper(type("AnyClass", (), {})))
def test_ispackage(self):
self.istest(inspect.ispackage, 'asyncio')
self.istest(inspect.ispackage, 'importlib')
self.assertFalse(inspect.ispackage(inspect))
self.assertFalse(inspect.ispackage(mod))
self.assertFalse(inspect.ispackage(':)'))
class FakePackage:
__path__ = None
self.assertFalse(inspect.ispackage(FakePackage()))
def test_iscoroutine(self):
async_gen_coro = async_generator_function_example(1)

View File

@ -0,0 +1,2 @@
Add function :func:`inspect.ispackage` to determine whether an object is a
:term:`package` or not.