我发现从基类继承可以根据inspect.signature
改变派生类的签名,我想知道这是如何发生的。具体来说,有问题的基类是tensorflow.keras.layers.Layer
:
import sys
import inspect
import tensorflow as tf
class Class1(tf.keras.layers.Layer):
def __init__(self, my_arg: int):
pass
class Class2:
def __init__(self, my_arg: int):
pass
print("Python version: ", sys.version)
print("Tensorflow version: ", tf.__version__)
print("Class1 signature: ", inspect.signature(Class1))
print("Class2 signature: ", inspect.signature(Class2))
输出
Python version: 3.8.10 (default, Mar 23 2023, 13:10:07)
[GCC 9.3.0]
Tensorflow version: 2.12.0
Class1 signature: (*args, **kwargs)
Class2 signature: (my_arg: int)
我试着运行上面的代码,我希望它为两个类打印相同的签名。
1条答案
按热度按时间vqlkdk9b1#
这是Python早期版本特有的bug行为,包括Python 3.8和Python 3.9/3.10的早期补丁版本
在3.8和3.9.4中:
在较新版本的Python中,如3.9.17和最新版本的3.10和3.11,结果是你所期望的:
我不能100%确定到底是什么改变了这些python版本之间的行为,但我最好的猜测是,这与this issue或this issue有关,这在Python3.11中得到了修复,并被反向移植到了一些早期的Python版本。然而,Python3.8没有收到任何这些反向移植修复。