📅  最后修改于: 2023-12-03 15:37:27.304000             🧑  作者: Mango
在开发Python程序时,经常需要查找变量、函数、类等的定义范围。Python提供了一些内置函数和方法来查找范围。
globals()
函数返回全局作用域中的所有变量和它们的值,以字典的形式显示。可以使用它来查找全局作用域中的变量。
globals()
返回结果:
{
'__name__': '__main__',
'__doc__': None,
'__package__': None,
'__loader__': <class '_frozen_importlib.BuiltinImporter'>,
'__spec__': None,
'__annotations__': {},
'__builtins__': <module 'builtins' (built-in)>,
'function1': <function function1 at 0x7f8246010320>,
'variable1': 'value1',
'Class1': <class '__main__.Class1'>
}
从上述结果中可以看到,全局作用域中包含变量variable1
、函数function1
和类Class1
。
locals()
函数返回当前作用域中的所有变量和它们的值,以字典的形式显示。可以使用它来查找当前作用域中的变量。
def function1():
variable1 = 'value1'
print(locals())
function1()
返回结果:
{
'variable1': 'value1'
}
从上述结果中可以看到,函数function1
中定义了变量variable1
,并且可以通过locals()
函数查找到它。
inspect
模块提供了一些内置函数和方法来查找范围。其中的两个方法是getmembers()
和getmembers()
。
getmembers()
方法返回一个包含所有成员名称和值的元组列表。可以通过它来查找对象的所有成员。
import inspect
class Class1:
def __init__(self):
self.variable1 = 'value1'
members = inspect.getmembers(Class1)
print(members)
返回结果:
[
('__class__', <class 'type'>),
('__delattr__', <slot wrapper '__delattr__' of 'object' objects>),
('__dict__', <attribute '__dict__' of 'Class1' objects>),
('__dir__', <method '__dir__' of 'object' objects>),
('__doc__', None),
('__eq__', <slot wrapper '__eq__' of 'object' objects>),
('__format__', <method '__format__' of 'object' objects>),
('__ge__', <slot wrapper '__ge__' of 'object' objects>),
('__getattribute__', <slot wrapper '__getattribute__' of 'object' objects>),
('__gt__', <slot wrapper '__gt__' of 'object' objects>),
('__hash__', <slot wrapper '__hash__' of 'object' objects>),
('__init__', <function Class1.__init__ at 0x7f82460106a8>),
('__init_subclass__', <built-in method __init_subclass__ of type object at 0x9424c8>),
('__le__', <slot wrapper '__le__' of 'object' objects>),
('__lt__', <slot wrapper '__lt__' of 'object' objects>),
('__module__', '__main__'),
('__ne__', <slot wrapper '__ne__' of 'object' objects>),
('__new__', <built-in method __new__ of type object at 0xb42ec8>),
('__reduce__', <method '__reduce__' of 'object' objects>),
('__reduce_ex__', <method '__reduce_ex__' of 'object' objects>),
('__repr__', <slot wrapper '__repr__' of 'object' objects>),
('__setattr__', <slot wrapper '__setattr__' of 'object' objects>),
('__sizeof__', <method '__sizeof__' of 'object' objects>),
('__str__', <slot wrapper '__str__' of 'object' objects>),
('__subclasshook__', <built-in method __subclasshook__ of type object at 0x9424c8>),
('__weakref__', <attribute '__weakref__' of 'Class1' objects>),
('variable1', 'value1')
]
从上述结果中可以看到,类Class1
有成员variable1
。
getmembers()
方法返回一个包含所有符合条件的成员名称和值的元组列表。可以通过它来查找对象的符合条件的成员。
members = inspect.getmembers(Class1, lambda m: isinstance(m, str))
print(members)
返回结果:
[
('__doc__', None),
('__module__', '__main__'),
('variable1', 'value1')
]
从上述结果中可以看到,类Class1
有两个字符串类型的成员__doc__
和__module__
,以及一个字符串类型的成员variable1
。
在Python中,有多种方式可以查找变量、函数、类等的定义范围。其中包括使用globals()
函数、locals()
函数和inspect
模块提供的方法等。熟练使用这些工具,可以提高编程效率和代码质量。