基于默认参数的Python词典中的映射命令

时间:2019-04-08 16:43:44

标签: python amazon-web-services dictionary

我希望能够使用特定的系统调用,具体取决于在字典中访问哪个键。 函数可能类似于:

def query_ec2(self, region=None, instanceId=None):

    if region == None and instanceId == None:
        return json.loads(subprocess.check_output("aws ec2 describe-instances", shell=True))

    elif region != None and instanceId == None:
        return json.loads(subprocess.check_output(("aws ec2 describe-instances --region {}").format(region), shell=True))

    elif instanceId != None and region == None:
        return json.loads(subprocess.check_output(("aws ec2 describe-instances --instance-id {}").format(instanceId), shell=True))

    else:
        return json.loads(subprocess.check_output(("aws ec2 describe-instances --region {}--instance-id {}").format(region, instanceId), shell=True))

我想知道是否有什么方法可以摆脱条件语句,并使用标准字典将特定的系统调用映射到提供的参数。

2 个答案:

答案 0 :(得分:0)

虽然@ DroidX86在他/她的注释中正确,但是您可以使用嵌套的if语句。这并不是真正的改善,而是更多的偏好设置问题:

def query_ec2(self, region=None, instanceId=None):

    if region is None:
        if instanceId is None:
            return json.loads(subprocess.check_output(
                              "aws ec2 describe-instances", shell=True))
        else:
            return json.loads(subprocess.check_output((
                              "aws ec2 describe-instances --instance-id \
                              {}").format(instanceId), shell=True))
    else:
        if instanceId is None:
            return json.loads(subprocess.check_output((
                              "aws ec2 describe-instances --region \
                              {}").format(region), shell=True))
        else:
            return json.loads(subprocess.check_output((
                              "aws ec2 describe-instances --region \
                              {}--instance-id {}").format(region, instanceId),
                              shell=True))

答案 1 :(得分:0)

我认为

import shlex


def query_ec2(self, region=None, instanceId=None):
    args = ["aws ec2 describe-instances"]
    if region:
        args.append("--region {}".format(shlex.quote(region)))
    if instanceId:
        args.append("--instance-id {}".format(shlex.quote(instanceId)))

    command = " ".join(args)
    return json.loads(subprocess.check_output(args, shell=True))

可能是最干净的方法。

我随意添加了shlex.quote()个调用,以防止恶意用户输入。