📜  在 python 中查找范围(1)

📅  最后修改于: 2023-12-03 15:37:27.304000             🧑  作者: Mango

在Python中查找范围

在开发Python程序时,经常需要查找变量、函数、类等的定义范围。Python提供了一些内置函数和方法来查找范围。

globals()函数

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()函数

locals()函数返回当前作用域中的所有变量和它们的值,以字典的形式显示。可以使用它来查找当前作用域中的变量。

def function1():
    variable1 = 'value1'
    print(locals())

function1()

返回结果:

{
    'variable1': 'value1'
}

从上述结果中可以看到,函数function1中定义了变量variable1,并且可以通过locals()函数查找到它。

inspect模块

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模块提供的方法等。熟练使用这些工具,可以提高编程效率和代码质量。