Как установить параметр ** в Python - PullRequest
0 голосов
/ 08 мая 2020

Я новичок ie в 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")

Но я получаю эту ошибку:

получил неожиданный аргумент ключевого слова 'builder_init_kwargs'

Я хочу установить data_dir, но не Не знаю, как это сделать. Я пытался установить download_dir в omniglot_builder.download_and_prepare(download_dir="d:\\tmp"), но он все еще загружает его в ~/tensorflow_datasets.

Из документации Tensorflow для tdfs.builder :

** builder_init_kwargs: список аргументов ключевого слова, переданный в DatasetBuilder. Они переопределят аргументы ключевого слова, переданные в имени, если таковые имеются.

Как я могу установить значение параметра builder_init_kwargs?

Ответы [ 3 ]

1 голос
/ 08 мая 2020

На основе документов , в которых говорится, что метод tfds.builder имеет тип:

tfds.builder(
    name, **builder_init_kwargs
)

Вы хотите сделать это:

dict = {"name":"omniglot:3.0.0", "data_dir": "d:\\tmp"}
tfds.builder(**dict)

The ** синтаксис передает переменную как kwargs, что делает приведенный выше код эквивалентным:

tfds.builder(name="omniglot:3.0.0", data_dir="d:\\tmp")
1 голос
/ 08 мая 2020

Кажется, вам нужна небольшая помощь с упаковкой и распаковкой аргументов.

В определении функции или метода вы указываете последовательность аргументов, которые будут переданы. Если вы хотите иметь переменное количество входных аргументов, механизм состоит в том, чтобы «упаковать» их вместе в список или каталог. Например, скажем, вы хотите получить сумму всех заданных аргументов:

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]}')

Теперь, когда вы используете (вызываете) функцию, иногда вам нужно иметь возможность «распаковать» список или словарь в вызов функции. Тот же оператор используется для упаковки и распаковки, поэтому он выглядит очень похоже:

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

Теперь, наконец, переходим к вашему конкретному c случаю: функция, которую вы пытаетесь использовать, определяет ** kwargs в своем определении . Это означает, что он будет принимать любые последующие аргументы ключевого слова и упаковывать их все в словарь, который будет использоваться внутри определения функции. Практическое значение этого состоит в том, что вы можете предоставить функции аргументы ключевого слова, которые специально не определены в сигнатуре функции (это особенно часто, когда функция вызывает другую функцию и передает аргументы). Если вы уже упаковали свои аргументы перед вызовом функции, их легко распаковать, используя тот же процесс, который показан Оли: tfds.builder(**dict)

1 голос
/ 08 мая 2020

Чтобы установить аргумент kwargs в python, вам нужно просто добавить ** перед самим аргументом.

Итак, это будет ваш код:

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, но я не знаком с tenorflow.

Надеюсь, это поможет!

...