2015-11-05 80 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。这里的例子非常接近我认为你想要做的事情。