I read a book, Writing Idiomatic Python Although I usually write python codes, I have not paid attension to the style of these codes. By reading this book, I have noticed that there are pythonic style in python codes. And I think it was good mind to write python code. There were many Halmful, Idiomaric phrases about python code. So I’d like to introduce some of them which I’ll write in my own code.
And of course, all python developers should read this book!!
Enumerate
Usually, I write loop code like below.
index = 0
for element in ["Takeshi", "Nobita", "Masao"]:
print('{}:{}'.format(index, element))
index += 1
But it is harmful according to this book. Correctly, you should write like below.
conteiner = ["Takeshi", "Nobita", "Masao"]
for index, element in enumerate(conteiner):
print('{}:{}'.format(index, element)
Arbitrary arguments
In python, you can write arbitrary arguments with *args
or **kwargs
. Arbutrary arguments are useful when you
want to implement some types of API which is different by package versions. You can write like below.
def make_api_call(a, b, c, *args, **kwargs):
print a
print b
print c
print args
print kwargs
Run this
#!/usr/bin/python
if __name__ == "__main__":
make_api_call(1, 2, 3, 4, 5, 6, name="Takeshi", age=23)
# --console--
# 1
# 2
# 3
# (4, 5, 6)
# {'age': 23, 'name': 'Takeshi'}
#
Avoid Swallowing useful exceptions
In python, exception
is common phrases used in for
loop or etc. In addition to this,
exception
gives you a useful information for debugging. So you should not swallow these exceptions
by writing bare except
clause. If you don’t have any idea about what type exceptions are raised from
third-party library, you should raise it again.
import requests
def get_json_response(url):
try:
r = requests.get(url)
return r.json()
except:
raise
Avoid using a temporary variables with swapping
Use tuple.
foo = "FOO"
bar = "BAR"
(foo, bar) = (bar, foo)
Use join
method. It’s more faster
result_list = ["Takeshi", "Nobita", "Masuo"]
reesult_string = " ".join(result_list)
Use format function to make a formatted string
# user is a dictionary
def get_formatted_user_info(user):
output = 'Nama: {user.name}, Age: {user.age}, Sex: {user.sex}'.format(user=user)
Prefer xrange
to range
Use xrange
for index in xrange(10000):
print('index: {}'.format(index)
Default value got from dicionary
If there are name
field in user, get
returns 'Unknown'
.
username = user.get('name', 'Unknown')
Dictionary complehension
The list complehension is well known about python context. But dictionary complehension is as important as this.
user_email = {user.name: user.email for user in users_list if user.email}
Set complehension
In set syntax, you can use complehension expression.
users_first_names = {user.first_name for user in users}
Ignore unnecessary row in tuple
If there are any data which is not necessary for you in tuple, ignore it with _
(name, age, _, _) = get_user_info(user)
if age > 20:
output = '{name} can drink!'.format(name=name)
Generator
Python list comprehension is very useful, however, processing very large list will run out of memory.
In this case you should use generator
which is iterative expression, but doesn’t use memory.
users = ["Nobita", "Takeshi", "Masuo"]
for i in (user.upper() for user in users if user != "Takeshi"):
print(i)
# NOBITA
# MASUO
Refer PEP8
Python has standard set of formatting rule officially. It is called PEP8. You should install this plugin your editor.
Write as PEP252
PEP257 is the set of rules of document formattings.
def calculate_statistics(value_list):
"""Return a tuple containing the mean, median and the mode of a list of integers
Arguments:
value_list -- a list of integer values
"""
Last but not least
I am a pythonia. With reading this book, I am able to write more pythonic code at my work scene.