There is Always a Better Way, Most Likely Waiting as a Built-In Method in the Standard Library

Originally published on February 17, 2022 at https://rivea0.github.io/blog

I was reading Al Sweigart’s Beyond the Basic Stuff with Python –which I would recommend if you’re already finished Automate the Boring Stuff– when I had a realization.
Consider the following terrible looking code:

<span>def</span> <span>check_holiday</span><span>(</span><span>season</span><span>):</span>
<span>if</span> <span>season</span> <span>==</span> <span>'</span><span>Winter</span><span>'</span><span>:</span>
<span>holiday</span> <span>=</span> <span>'</span><span>New Year</span><span>\'</span><span>s Day</span><span>'</span>
<span>elif</span> <span>season</span> <span>==</span> <span>'</span><span>Spring</span><span>'</span><span>:</span>
<span>holiday</span> <span>=</span> <span>'</span><span>May Day</span><span>'</span>
<span>elif</span> <span>season</span> <span>==</span> <span>'</span><span>Summer</span><span>'</span><span>:</span>
<span>holiday</span> <span>=</span> <span>'</span><span>Juneteenth</span><span>'</span>
<span>elif</span> <span>season</span> <span>==</span> <span>'</span><span>Fall</span><span>'</span><span>:</span>
<span>holiday</span> <span>=</span> <span>'</span><span>Halloween</span><span>'</span>
<span>else</span><span>:</span>
<span>holiday</span> <span>=</span> <span>'</span><span>Personal day off</span><span>'</span>
<span>return</span> <span>holiday</span>
<span>def</span> <span>check_holiday</span><span>(</span><span>season</span><span>):</span>
    <span>if</span> <span>season</span> <span>==</span> <span>'</span><span>Winter</span><span>'</span><span>:</span>
        <span>holiday</span> <span>=</span> <span>'</span><span>New Year</span><span>\'</span><span>s Day</span><span>'</span> 
    <span>elif</span> <span>season</span> <span>==</span> <span>'</span><span>Spring</span><span>'</span><span>:</span>
        <span>holiday</span> <span>=</span> <span>'</span><span>May Day</span><span>'</span> 
    <span>elif</span> <span>season</span> <span>==</span> <span>'</span><span>Summer</span><span>'</span><span>:</span>
        <span>holiday</span> <span>=</span> <span>'</span><span>Juneteenth</span><span>'</span> 
    <span>elif</span> <span>season</span> <span>==</span> <span>'</span><span>Fall</span><span>'</span><span>:</span>
        <span>holiday</span> <span>=</span> <span>'</span><span>Halloween</span><span>'</span> 
    <span>else</span><span>:</span>
        <span>holiday</span> <span>=</span> <span>'</span><span>Personal day off</span><span>'</span>

    <span>return</span> <span>holiday</span>
def check_holiday(season): if season == 'Winter': holiday = 'New Year\'s Day' elif season == 'Spring': holiday = 'May Day' elif season == 'Summer': holiday = 'Juneteenth' elif season == 'Fall': holiday = 'Halloween' else: holiday = 'Personal day off' return holiday

Enter fullscreen mode Exit fullscreen mode

It looks indeed not that good. Of course, what you would do if you are somewhat a beginner who simply wants to follow best practices, is to come up with a better and more elegant way of writing this same piece of code – even though it might be laughable and pitiable to your future self, and to anyone who would like to pity you anyway.

What I’ve thought at first when I saw the code above was that I would simply use a dictionary to store the seasons as keys and corresponding holidays as their values, and that’s it. And, I would loop over the whole dictionary to compare the seasons and assign the holiday. It would look like this:

<span>def</span> <span>check_holiday</span><span>(</span><span>season</span><span>):</span>
<span>seasons</span> <span>=</span> <span>{</span><span>'</span><span>Winter</span><span>'</span><span>:</span> <span>'</span><span>New Year</span><span>\'</span><span>s Day</span><span>'</span><span>,</span>
<span>'</span><span>Spring</span><span>'</span><span>:</span> <span>'</span><span>May Day</span><span>'</span><span>,</span>
<span>'</span><span>Summer</span><span>'</span><span>:</span> <span>'</span><span>Juneteenth</span><span>'</span><span>,</span>
<span>'</span><span>Fall</span><span>'</span><span>:</span> <span>'</span><span>Halloween</span><span>'</span><span>}</span>
<span>holiday</span> <span>=</span> <span>'</span><span>Personal day off</span><span>'</span>
<span>for</span> <span>k</span><span>,</span> <span>v</span> <span>in</span> <span>seasons</span><span>.</span><span>items</span><span>():</span>
<span>if</span> <span>season</span> <span>==</span> <span>k</span><span>:</span>
<span>holiday</span> <span>=</span> <span>v</span>
<span>return</span> <span>holiday</span>
<span>def</span> <span>check_holiday</span><span>(</span><span>season</span><span>):</span>
    <span>seasons</span> <span>=</span> <span>{</span><span>'</span><span>Winter</span><span>'</span><span>:</span> <span>'</span><span>New Year</span><span>\'</span><span>s Day</span><span>'</span><span>,</span>  
               <span>'</span><span>Spring</span><span>'</span><span>:</span> <span>'</span><span>May Day</span><span>'</span><span>,</span>  
               <span>'</span><span>Summer</span><span>'</span><span>:</span> <span>'</span><span>Juneteenth</span><span>'</span><span>,</span>  
               <span>'</span><span>Fall</span><span>'</span><span>:</span> <span>'</span><span>Halloween</span><span>'</span><span>}</span>

    <span>holiday</span> <span>=</span> <span>'</span><span>Personal day off</span><span>'</span>

    <span>for</span> <span>k</span><span>,</span> <span>v</span> <span>in</span> <span>seasons</span><span>.</span><span>items</span><span>():</span>
        <span>if</span> <span>season</span> <span>==</span> <span>k</span><span>:</span>
            <span>holiday</span> <span>=</span> <span>v</span>

    <span>return</span> <span>holiday</span>
def check_holiday(season): seasons = {'Winter': 'New Year\'s Day', 'Spring': 'May Day', 'Summer': 'Juneteenth', 'Fall': 'Halloween'} holiday = 'Personal day off' for k, v in seasons.items(): if season == k: holiday = v return holiday

Enter fullscreen mode Exit fullscreen mode

At first glance, it seemed okay. It is definitely cleaner than the one with bunch of if-else statements. But, as always, if you have come up with a better way of doing something, know that there is even a better way of doing it. Like this:

<span>def</span> <span>check_holiday</span><span>(</span><span>season</span><span>):</span>
<span>holiday</span> <span>=</span> <span>{</span><span>'</span><span>Winter</span><span>'</span><span>:</span> <span>'</span><span>New Year</span><span>\'</span><span>s Day</span><span>'</span><span>,</span>
<span>'</span><span>Spring</span><span>'</span><span>:</span> <span>'</span><span>May Day</span><span>'</span><span>,</span>
<span>'</span><span>Summer</span><span>'</span><span>:</span> <span>'</span><span>Juneteenth</span><span>'</span><span>,</span>
<span>'</span><span>Fall</span><span>'</span><span>:</span> <span>'</span><span>Halloween</span><span>'</span><span>}.</span><span>get</span><span>(</span><span>season</span><span>,</span> <span>'</span><span>Personal day off</span><span>'</span><span>)</span>
<span>return</span> <span>holiday</span>
<span>def</span> <span>check_holiday</span><span>(</span><span>season</span><span>):</span>
    <span>holiday</span> <span>=</span> <span>{</span><span>'</span><span>Winter</span><span>'</span><span>:</span> <span>'</span><span>New Year</span><span>\'</span><span>s Day</span><span>'</span><span>,</span>  
               <span>'</span><span>Spring</span><span>'</span><span>:</span> <span>'</span><span>May Day</span><span>'</span><span>,</span>  
               <span>'</span><span>Summer</span><span>'</span><span>:</span> <span>'</span><span>Juneteenth</span><span>'</span><span>,</span>  
               <span>'</span><span>Fall</span><span>'</span><span>:</span> <span>'</span><span>Halloween</span><span>'</span><span>}.</span><span>get</span><span>(</span><span>season</span><span>,</span> <span>'</span><span>Personal day off</span><span>'</span><span>)</span>
    <span>return</span> <span>holiday</span>
def check_holiday(season): holiday = {'Winter': 'New Year\'s Day', 'Spring': 'May Day', 'Summer': 'Juneteenth', 'Fall': 'Halloween'}.get(season, 'Personal day off') return holiday

Enter fullscreen mode Exit fullscreen mode

It is obvious when you realize that you’ve already had that better tool in your toolkit that comes built-in for you all along, and that’s embarrassing.

So, what this code does is the same thing, only that we use Python’s built-in get method on a dictionary to simply return the season’s value – assigning it to holiday if the season exists, if not, returning ‘Personal day off’ as the default value.

Of course, there might be a better way of doing this, but what I’ve come to realize is that there is always a better choice, and it doesn’t hurt to remember that –in the case of Python– you have already tons of built-in methods in the standard library to use, which would most likely be better and more efficient than what you would write anyway.

This might be a trivial thing, but it is nevertheless good food for thought. So, if you think you have found a better way of doing something, there’s even a better way than that. And it might be under your nose all along, simply waiting for you to remember to use it.

原文链接:There is Always a Better Way, Most Likely Waiting as a Built-In Method in the Standard Library

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
Life must be lived with love, happiness, and dreams.
人生一定要有爱,有快乐,有梦想
评论 抢沙发

请登录后发表评论

    暂无评论内容