2015-11-05 85 views
0

我想以編程方式編寫調用boto3方法並更改方法內默認參數的方法。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 

因此,對於默認值,我使用無。但是,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 

但這是可怕的方式。 LogUri只是一個例子。我希望能夠改變其他參數。我不能讓那些嵌套的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一個例子:

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(...) 

當我跑,我得到: 缺少必需的參數輸入:「名稱」

我使用錯誤的語法不知何故? 我確實使用了從current_emr.meta.method_to_api_mapping得到的RunJobFlow 也許這不是emr的provide-client-params?

我還沒有看到「你好」印刷

回答

0

有除指定的服務的,在這種情況下,我們只是給什麼都沒有缺省值。如果您想在運行時更改參數,則可以掛入事件系統。你可以閱讀關於here。這裏的例子非常接近我認爲你想要做的事情。