星号 * 作为 function/class/method 签名中的第一个参数是什么意思?
What does the asterisk * mean as the first argument in the signature of a function/class/method?
我目前正在尝试了解 Tensorforce 库。我一直偶然发现以下形式的签名:
class tensorforce.core.layers.Dense(*, size, bias=True, activation='tanh', dropout=0.0, initialization_scale=1.0, vars_trainable=True, l2_regularization=None, name=None, input_spec=None)
如果星号 * 在开头是什么意思,我如何实例化这样一个 class,或者你能做到吗?
形式的实例化
from tensorforce.core.layers import Dense
d = Dense(4)
失败并显示错误消息
Traceback (most recent call last):
File "<ipython-input-6-df27ca99113e>", line 1, in <module>
Dense(4)
TypeError: __init__() takes 1 positional argument but 2 were given
在 *
“参数”之后指定的任何参数(因此在本例中为所有参数)都是 keyword-only arguments。它们只能通过关键字提供,而不是位置;这意味着您的示例应该是:
from tensorforce.core.layers import Dense
d = Dense(size=4)
您收到的错误消息不是很直观,是吗?这是因为在 Python 中,一个对象的方法本质上是一个 automatically receives the object itself as the first argument 的函数(这就是为什么你通常在方法 定义中写 self
,但在调用方法时不要提供它。
在这种情况下,__init__
方法采用一个且恰好一个位置参数:它自己的对象实例。由于您还按位置提供了 size
,因此 Python 抱怨它有两个参数——即使您只明确地给了它一个。
我目前正在尝试了解 Tensorforce 库。我一直偶然发现以下形式的签名:
class tensorforce.core.layers.Dense(*, size, bias=True, activation='tanh', dropout=0.0, initialization_scale=1.0, vars_trainable=True, l2_regularization=None, name=None, input_spec=None)
如果星号 * 在开头是什么意思,我如何实例化这样一个 class,或者你能做到吗?
形式的实例化
from tensorforce.core.layers import Dense
d = Dense(4)
失败并显示错误消息
Traceback (most recent call last):
File "<ipython-input-6-df27ca99113e>", line 1, in <module>
Dense(4)
TypeError: __init__() takes 1 positional argument but 2 were given
在 *
“参数”之后指定的任何参数(因此在本例中为所有参数)都是 keyword-only arguments。它们只能通过关键字提供,而不是位置;这意味着您的示例应该是:
from tensorforce.core.layers import Dense
d = Dense(size=4)
您收到的错误消息不是很直观,是吗?这是因为在 Python 中,一个对象的方法本质上是一个 automatically receives the object itself as the first argument 的函数(这就是为什么你通常在方法 定义中写 self
,但在调用方法时不要提供它。
在这种情况下,__init__
方法采用一个且恰好一个位置参数:它自己的对象实例。由于您还按位置提供了 size
,因此 Python 抱怨它有两个参数——即使您只明确地给了它一个。