簡體   English   中英

如何提高嵌套 if 和 for 語句的可讀性

[英]How can i improve the readablility of nested if and for statements

我有一段非常討厭的代碼,我想重構,但我已經這樣做了,因為它變得完全不可讀。

 for region in feed['config']['regions']:
            if region['region'] == region_name:
                for instance_type in region['instanceTypes']:
                    if instance_type['type'] == instance_type_name:
                        for instance_size in instance_type['sizes']:
                            if instance_size['size'] == instance_size_name:
                                for platform in instance_size['valueColumns']:
                                    if platform['name'] == platform_name:
                                        prices = platform['prices']
                                        assert prices.keys() == ['USD']
                                        return decimal.Decimal(prices['USD'])
        assert False, "Failed to determine price for instance with region=%r, type=%r, size=%r, platform=%r" % \
                (region_name, instance_type_name, instance_size_name, platform_name)

我一直在努力在每個循環或 if 語句中使用函數,但這會給我一大堆函數。 有更好的解決方案嗎?

try:
    region = [r for r in feed['config']['regions'] if region['region'] == region_name][0]
    instance_type = [t for t in region['instanceTypes'] if i['type'] == instance_type_name][0]
    # ...
    return decimal.Decimal(prices['USD'])
except IndexError:
    raise Exception("Failed to determine price for instance with region=%r, type=%r, size=%r, platform=%r" % 
                (region_name, instance_type_name, instance_size_name, platform_name))

或更進一步:

def filter_by_key(key, value, objects):
    return [o for o in objects if region[key] == value][0]

try:
    region = filter_by_key('region', region_name, feed['config']['regions'])
    instance_type = filter_by_key('type', instace_type_name, region['instanceTypes'])
    # ...
    return decimal.Decimal(prices['USD'])
except IndexError:
    raise Exception("Failed to determine price for instance with region=%r, type=%r, size=%r, platform=%r" % 
                (region_name, instance_type_name, instance_size_name, platform_name))

如果你想讓它保持循環,你可以使用continue來保存縮進:

for region in feed['config']['regions']:
    if region['region'] != region_name: continue
    for instance_type in region['instanceTypes']:
        if instance_type['type'] != instance_type_name: continue
        for instance_size in instance_type['sizes']:
            if instance_size['size'] != instance_size_name: continue
            for platform in instance_size['valueColumns']:
                if platform['name'] != platform_name: continue
                prices = platform['prices']
                assert prices.keys() == ['USD']
                return decimal.Decimal(prices['USD'])
assert False, "Failed to determine price for instance with region=%r, type=%r, size=%r, platform=%r" % \
                (region_name, instance_type_name, instance_size_name, platform_name)

或者使用列表理解:

regions = (r for r in feed['config']['regions'] if r['region'] == region_name)
instance_types = (i for i in r['instanceTypes'] for r in regions if i['type'] == instance_type_name)
instance_sizes = (i for i in t['sizes'] for t in instance_types if i['size'] == instance_size_name)
platforms = (p for p in s['valueColumns'] for s in instance_sizes if p['name'] == platform_name)
for platform in platforms:
    prices = platform['prices']
    assert prices.keys() == ['USD']
    return decimal.Decimal(prices['USD'])
assert False, "Failed to determine price for instance with region=%r, type=%r, size=%r, platform=%r" % \
                (region_name, instance_type_name, instance_size_name, platform_name)      

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM