0

我想以编程方式编写一个调用 boto3 方法并更改方法内的默认参数的方法。

例如,如果日志设置为 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 只是一个例子。我希望能够更改其他参数。我就是不能做出那些嵌套的 if。

我可以使用 boto3 中的各种类型(如字符串)的默认值吗?


编辑 1

从下面的第一条评论, http://boto3.readthedocs.org/en/latest/guide/events.html#provide-client-params

有趣的 API。虽然没有很好的记录。他们的 s3 clistnt 示例工作正常,

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

然后反应很好,我也看到打印了“你好”。

但是现在我尝试为 emr 的 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 提供客户端参数?

我也没有看到打印“你好”

4

1 回答 1

0

除了服务指定的值外,没有默认值,在这种情况下,我们什么都不发送。如果您想在运行时更改参数,您可以连接到事件系统。你可以在这里阅读。那里的例子非常接近我认为你想做的事情。

于 2015-11-05T20:44:12.447 回答