python inspect模块有哪些用法?
inspect模块是Python的一个标准库,主要用于获取和描述类、函数、模块等对象的信息。它提供了查看对象内部结构的方法,包括函数签名、类继承关系、属性和方法等。该模块中一些重要的函数和类包括:
1. inspect.getmembers(object[, predicate])
该函数用于获取一个对象的所有成员,返回一个包含(name, value)元组的列表。第一个参数为需要获取成员的对象,第二个参数为可选的过滤函数,用于筛选成员。下面是一个例子:
```python
import inspect
class MyClass:
def __init__(self):
self.x = 1
self.y = 2
def my_method(self):
pass
obj = MyClass()
members = inspect.getmembers(obj)
print(members)
```
输出如下:
```[('__class__',
```
例如,可以使用该函数动态调用对象的方法:
```python
for name, value in members:
if name == 'my_method':
value()
```
输出如下:
```python
>>> my_method is called
```
2. inspect.signature(object)
该函数用于获取一个函数、方法等对象的签名。它返回一个inspect.Signature对象,其中包含函数名、参数名、类型、缺省值等信息。下面是一个例子:
```python
import inspect
def myfunction(a: int, b: float = 0.0, *args: str, **kwargs: int) -> str:
pass
signature = inspect.signature(myfunction)
print(signature)
```
输出如下:
```python
(a: int, b: float = 0.0, *args: str, **kwargs: int) -> str
```
可以使用该函数判断函数参数类型:
```python
for name, parameter in signature.parameters.items():
if parameter.annotation is not inspect._empty:
print(f'{name} type is {parameter.annotation}')
```
输出如下:
```python
a type is
b type is
args type is
kwargs type is
return type is
```
3. inspect.getfile(object)
该函数用于获取一个对象所在的文件名。下面是一个例子:
```python
import inspect
def myfunction():
pass
filename = inspect.getfile(myfunction)
print(filename)
```
输出如下:
```
```
该函数可以用于检测模块是否被修改:
```python
import inspect
import mymodule
old_modify_time = os.path.getmtime(inspect.getfile(mymodule))
# do some modification to mymodule
new_modify_time = os.path.getmtime(inspect.getfile(mymodule))
if new_modify_time > old_modify_time:
print('module is modified!')
```
inspect模块除了上述方法外,还提供了很多有用的函数和类,例如:
- inspect.getmodule(object)
- inspect.getabsfile(object)
- inspect.getdoc(object)
- inspect.getcomments(object)
- inspect.getframeinfo(frame[, context])
- inspect.stack(context=None)
这些函数和类可以帮助我们更好地理解和调试Python代码。
总的来说,使用inspect模块可以方便地进行反射操作,便于代码调试和动态生成对象。