我希望能够使用特定的系统调用,具体取决于在字典中访问哪个键。 函数可能类似于:
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))
我想知道是否有什么方法可以摆脱条件语句,并使用标准字典将特定的系统调用映射到提供的参数。
答案 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()
个调用,以防止恶意用户输入。