如何在 Python 中设置 ** 参数
How to set a ** parameter in Python
我是 Python 的新手。
我正在使用 Python 3.7.7 和 Tensorflow 2.1.0。
这是我的代码:
import tensorflow as tf
import tensorflow_datasets as tfds
d = {"name": "omniglot:3.0.0", "data_dir": "d:\tmp"}
omniglot_builder = tfds.builder("omniglot:3.0.0", builder_init_kwargs=d)
omniglot_builder.download_and_prepare(download_dir="d:\tmp")
但是我得到这个错误:
got an unexpected keyword argument 'builder_init_kwargs'
我想设置data_dir
,但是不知道怎么设置。我试图在 omniglot_builder.download_and_prepare(download_dir="d:\tmp")
中设置 download_dir
但它仍然下载到 ~/tensorflow_datasets
.
来自 tdfs.builder 的 Tensorflow 文档:
**builder_init_kwargs: dict of keyword arguments passed to the DatasetBuilder. These will override keyword arguments passed in name,
if any.
如何设置builder_init_kwargs
参数值?
要在 python 中设置 kwargs 参数,您只需在参数本身之前添加 ** 即可。
所以,这将是您的代码:
import tensorflow as tf
import tensorflow_datasets as tfds
dict = {"name": "omniglot:3.0.0", "data_dir": "d:\tmp"}
omniglot_builder = tfds.builder("omniglot:3.0.0", builder_init_kwargs=**dict)
omniglot_builder.download_and_prepare(download_dir="d:\tmp")
当然,我只是猜测,因为我知道什么是kwargs参数,但我对tensorflow不熟悉。
希望对您有所帮助!
基于 docs,表示 tfds.builder
方法具有类型:
tfds.builder(
name, **builder_init_kwargs
)
您想这样做:
dict = {"name":"omniglot:3.0.0", "data_dir": "d:\tmp"}
tfds.builder(**dict)
**
语法将变量作为 kwargs 传递,使上面的代码等同于:
tfds.builder(name="omniglot:3.0.0", data_dir="d:\tmp")
看来您在参数打包和解包方面需要一点帮助。
在函数或方法的定义中,您指定将传递的参数序列。如果你想有可变数量的输入参数,机制是将它们 "pack" 一起放入一个列表或目录中。例如,假设您想获得给定所有参数的总和:
def get_sum(a, b): #only useful for two numbers
return a + b
def get_sum(a,b,c): #only useful for three numbers
return a + b
您必须对每个可能的输入参数数量进行不同的定义。解决方案是使用打包运算符将所有给定的参数打包到一个可以迭代的列表中
def get_sum(*list_of_inputs): # * will pack all subsequent positional arguments into a list
x = 0
for item in list_of_inputs:
x += item
return x
get_sum(1,2,3,4,5,6,7) #returns 28
get_sum() #returns 0
对于打包到字典中的关键字参数也可以这样做:
def foo(**keyword_args):
for k in keyword_args:
print(f'{k}: {keyword_args[k]}')
现在,当您使用(调用)函数时,有时您需要能够 "unpack" 将列表或字典放入函数调用中。打包和解包使用相同的操作符,所以看起来很相似:
def foo(a,b,c):
print(f'{a} + {b} = {c}')
arguments = ['spam', 'eggs', 'delicious']
foo(*arguments) #unpack the list of arguments into their required positions
现在终于到了您的具体情况:您尝试使用的函数在其定义中定义了 **kwargs。这意味着它将接受任何后续关键字参数并将它们全部打包到一个字典中以在函数定义中使用。这的实际含义是,您可以向函数签名中未明确定义的函数提供关键字参数(当函数调用另一个函数并传递参数时,这尤其常见)。如果您在调用函数之前已经打包了参数,则可以使用与 Oli 所示相同的过程轻松解包它们:tfds.builder(**dict)
我是 Python 的新手。
我正在使用 Python 3.7.7 和 Tensorflow 2.1.0。
这是我的代码:
import tensorflow as tf
import tensorflow_datasets as tfds
d = {"name": "omniglot:3.0.0", "data_dir": "d:\tmp"}
omniglot_builder = tfds.builder("omniglot:3.0.0", builder_init_kwargs=d)
omniglot_builder.download_and_prepare(download_dir="d:\tmp")
但是我得到这个错误:
got an unexpected keyword argument 'builder_init_kwargs'
我想设置data_dir
,但是不知道怎么设置。我试图在 omniglot_builder.download_and_prepare(download_dir="d:\tmp")
中设置 download_dir
但它仍然下载到 ~/tensorflow_datasets
.
来自 tdfs.builder 的 Tensorflow 文档:
**builder_init_kwargs: dict of keyword arguments passed to the DatasetBuilder. These will override keyword arguments passed in name, if any.
如何设置builder_init_kwargs
参数值?
要在 python 中设置 kwargs 参数,您只需在参数本身之前添加 ** 即可。
所以,这将是您的代码:
import tensorflow as tf
import tensorflow_datasets as tfds
dict = {"name": "omniglot:3.0.0", "data_dir": "d:\tmp"}
omniglot_builder = tfds.builder("omniglot:3.0.0", builder_init_kwargs=**dict)
omniglot_builder.download_and_prepare(download_dir="d:\tmp")
当然,我只是猜测,因为我知道什么是kwargs参数,但我对tensorflow不熟悉。
希望对您有所帮助!
基于 docs,表示 tfds.builder
方法具有类型:
tfds.builder(
name, **builder_init_kwargs
)
您想这样做:
dict = {"name":"omniglot:3.0.0", "data_dir": "d:\tmp"}
tfds.builder(**dict)
**
语法将变量作为 kwargs 传递,使上面的代码等同于:
tfds.builder(name="omniglot:3.0.0", data_dir="d:\tmp")
看来您在参数打包和解包方面需要一点帮助。
在函数或方法的定义中,您指定将传递的参数序列。如果你想有可变数量的输入参数,机制是将它们 "pack" 一起放入一个列表或目录中。例如,假设您想获得给定所有参数的总和:
def get_sum(a, b): #only useful for two numbers
return a + b
def get_sum(a,b,c): #only useful for three numbers
return a + b
您必须对每个可能的输入参数数量进行不同的定义。解决方案是使用打包运算符将所有给定的参数打包到一个可以迭代的列表中
def get_sum(*list_of_inputs): # * will pack all subsequent positional arguments into a list
x = 0
for item in list_of_inputs:
x += item
return x
get_sum(1,2,3,4,5,6,7) #returns 28
get_sum() #returns 0
对于打包到字典中的关键字参数也可以这样做:
def foo(**keyword_args):
for k in keyword_args:
print(f'{k}: {keyword_args[k]}')
现在,当您使用(调用)函数时,有时您需要能够 "unpack" 将列表或字典放入函数调用中。打包和解包使用相同的操作符,所以看起来很相似:
def foo(a,b,c):
print(f'{a} + {b} = {c}')
arguments = ['spam', 'eggs', 'delicious']
foo(*arguments) #unpack the list of arguments into their required positions
现在终于到了您的具体情况:您尝试使用的函数在其定义中定义了 **kwargs。这意味着它将接受任何后续关键字参数并将它们全部打包到一个字典中以在函数定义中使用。这的实际含义是,您可以向函数签名中未明确定义的函数提供关键字参数(当函数调用另一个函数并传递参数时,这尤其常见)。如果您在调用函数之前已经打包了参数,则可以使用与 Oli 所示相同的过程轻松解包它们:tfds.builder(**dict)