tensorflow 继承如何改变类签名

z9smfwbn  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(97)

我发现从基类继承可以根据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)

我试着运行上面的代码,我希望它为两个类打印相同的签名。

vqlkdk9b

vqlkdk9b1#

这是Python早期版本特有的bug行为,包括Python 3.8和Python 3.9/3.10的早期补丁版本
在3.8和3.9.4中:

Class1 signature:  (*args, **kwargs)
Class2 signature:  (my_arg: int)

在较新版本的Python中,如3.9.17和最新版本的3.10和3.11,结果是你所期望的:

Class1 signature:  (my_arg: int)
Class2 signature:  (my_arg: int)

我不能100%确定到底是什么改变了这些python版本之间的行为,但我最好的猜测是,这与this issuethis issue有关,这在Python3.11中得到了修复,并被反向移植到了一些早期的Python版本。然而,Python3.8没有收到任何这些反向移植修复。

相关问题