2015-11-05 4 views
0

Я хотел бы программно написать метод, который вызывает метод boto3 и изменяет параметры по умолчанию внутри методов.Значения по умолчанию для параметров метода boto3

Например, я хочу использовать свой журнал, если для журнала установлено значение Истина. В противном случае не регистрируйте его. Что-то вроде этого:

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, он не будет сохранен. Поэтому я мог бы сделать это с заявлениями, например:

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 

Но это ужасно. И LogUri был просто примером. Я хочу изменить другие параметры. Я просто не могу сделать эти вложенные ifs.

Есть ли значение по умолчанию для различных типов, таких как строки в boto3, которые я могу использовать?


Edit 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 ОГО в:

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 Возможно, это не параметры-client-param для emr?

Я также не вижу «Hello» напечатанный

ответ

0

Там нет значения по умолчанию не за исключением услуг указаны те, в этом случае мы просто не посылать ничего. Если вы хотите изменить параметры во время выполнения, вы можете подключиться к системе событий. Вы можете прочитать об этом here. Примеры там очень близки к тому, что я думаю, что вы хотите сделать.