Я хотел бы программно написать метод, который вызывает метод boto3 и изменяет параметры по умолчанию внутри методов.
Например, я хочу использовать свою корзину для журналов, если для параметра log задано значение True. В противном случае не регистрируйте его. Что-то вроде этого:
def my_run(log=False):
log_string = "s3://mylogs" if log else None
result = emr.run_job_flow(Name = 'EMRTest1',
LogUri = log_string ,
...
)
return result
Итак, для значения по умолчанию я использовал None. Однако boto3 ожидает строку. Я попробовал пустую строку по умолчанию, и это недопустимое значение.
Я знаю, что если я не укажу logURI, он не будет сохранен. Поэтому я мог бы сделать это с помощью операторов if, например:
def my_run(log=False):
if log:
result = emr.run_job_flow(Name = 'EMRTest1',
LogUri = "s3://mylogs" ,
...
)
else:
result = emr.run_job_flow(Name = 'EMRTest1',
...
)
return result
Но это ужасный способ. И ЛогУри был просто примером. Я хочу иметь возможность изменять другие параметры. Я просто не могу сделать эти вложенные ifs.
Есть ли значение по умолчанию для различных типов, таких как строки в boto3, которые я могу использовать?
Изменить 1
Из первого комментария ниже: http://boto3.readthedocs.org/en/latest/guide/events.html#provide-client-params
Интересный API. Хотя документировано не очень хорошо. Их пример для s3 clisnt работает нормально,
s3 = boto3.client('s3')
# Access the event system on the S3 client
event_system = s3.meta.events
# Create a function
def add_my_bucket(params, **kwargs):
print "Hello"
# Add the name of the bucket you want to default to.
if 'Bucket' not in params:
params['Bucket'] = 'mybucket'
# Register the function to an event
event_system.register('provide-client-params.s3.ListObjects', add_my_bucket)
response = s3.list_objects()
тогда ответ хороший, а также я вижу напечатанное «Привет».
Но теперь я пытаюсь сделать пример для run_job_flow emr:
def my_run(name):
def setName(params, **kwargs):
print "Hello"
params['Name'] = name
current_emr = boto3.client('emr')
event_system = current_emr.meta.events
event_system.register('provide-client-params.emr.RunJobFlow', setName)
current_emr.run_job_flow(...)
Когда я запускаю это, я получаю: Отсутствует обязательный параметр ввода: «Имя»
Я как-то использую неправильный синтаксис? Я использовал RunJobFlow, который я получил от current_emr.meta.method_to_api_mapping. Может быть, это не предоставление клиентских параметров для emr?
Я также не вижу напечатанного "Привет"