0

我希望能够根据字典中访问的键来使用特定的系统调用。函数可能如下所示:

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

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

4

2 回答 2

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))
于 2019-04-08T17:18:43.927 回答
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()调用来保护您免受恶意用户输入的侵害。

于 2019-04-08T17:23:33.833 回答