patternpythonMinor
Script to print weather report from OpenWeatherMap API
Viewed 0 times
scriptreportprintopenweathermapfromapiweather
Problem
This script prints the weather (fetching the information from a public API).
If anyone could review my code and answer my question about code structure and how should I code in the right way, I really appreciate that very much.
Questions:
-
I used many functions to do just one specific things, and return their value to be used in the next functions. Is this right?
-
In main I used composed way for calling functions, Is this right or there is a better way?
Note: You need to obtain your API key to try it.
```
import datetime
import json
import urllib.request
def time_converter(time):
converted_time = datetime.datetime.fromtimestamp(
int(time)
).strftime('%I:%M %p')
return converted_time
def url_builder(city_id):
user_api = '' # Obtain yours form: http://openweathermap.org/
unit = 'metric' # For Fahrenheit use imperial, for Celsius use metric, and the default is Kelvin.
api = 'http://api.openweathermap.org/data/2.5/weather?id=' # Search for your city ID here: http://bulk.openweathermap.org/sample/city.list.json.gz
full_api_url = api + str(city_id) + '&mode=json&units=' + unit + '&APPID=' + user_api
return full_api_url
def data_fetch(full_api_url):
url = urllib.request.urlopen(full_api_url)
output = url.read().decode('utf-8')
raw_api_dict = json.loads(output)
url.close()
return raw_api_dict
def data_organizer(raw_api_dict):
data = dict(
city=raw_api_dict.get('name'),
country=raw_api_dict.get('sys').get('country'),
temp=raw_api_dict.get('main').get('temp'),
temp_max=raw_api_dict.get('main').get('temp_max'),
temp_min=raw_api_dict.get('main').get('temp_min'),
humidity=raw_api_dict.get('main').get('humidity'),
pressure=raw_api_dict.get('main').get('pressure'),
sky=raw_api_dict['weather'][0]['main'],
sunrise=time_converter(raw_api_dict.get('sys').get('sunrise')),
sunset=time_converter(raw_api_dict.get('sys').get('s
If anyone could review my code and answer my question about code structure and how should I code in the right way, I really appreciate that very much.
Questions:
-
I used many functions to do just one specific things, and return their value to be used in the next functions. Is this right?
-
In main I used composed way for calling functions, Is this right or there is a better way?
Note: You need to obtain your API key to try it.
```
import datetime
import json
import urllib.request
def time_converter(time):
converted_time = datetime.datetime.fromtimestamp(
int(time)
).strftime('%I:%M %p')
return converted_time
def url_builder(city_id):
user_api = '' # Obtain yours form: http://openweathermap.org/
unit = 'metric' # For Fahrenheit use imperial, for Celsius use metric, and the default is Kelvin.
api = 'http://api.openweathermap.org/data/2.5/weather?id=' # Search for your city ID here: http://bulk.openweathermap.org/sample/city.list.json.gz
full_api_url = api + str(city_id) + '&mode=json&units=' + unit + '&APPID=' + user_api
return full_api_url
def data_fetch(full_api_url):
url = urllib.request.urlopen(full_api_url)
output = url.read().decode('utf-8')
raw_api_dict = json.loads(output)
url.close()
return raw_api_dict
def data_organizer(raw_api_dict):
data = dict(
city=raw_api_dict.get('name'),
country=raw_api_dict.get('sys').get('country'),
temp=raw_api_dict.get('main').get('temp'),
temp_max=raw_api_dict.get('main').get('temp_max'),
temp_min=raw_api_dict.get('main').get('temp_min'),
humidity=raw_api_dict.get('main').get('humidity'),
pressure=raw_api_dict.get('main').get('pressure'),
sky=raw_api_dict['weather'][0]['main'],
sunrise=time_converter(raw_api_dict.get('sys').get('sunrise')),
sunset=time_converter(raw_api_dict.get('sys').get('s
Solution
For your first question, yes, breaking down functions to do really specific things is always good. Makes it easier to use the same functions again in other situations etc.
For your second question, I would personally only call one function at a time, for me it makes it easier to read and understand.
Also, you can have a single print statement for a multi-line string for example:
and that would print:
but in your circumstance it might be a little bit difficult with all those format().
For your second question, I would personally only call one function at a time, for me it makes it easier to read and understand.
Also, you can have a single print statement for a multi-line string for example:
print('''' Hello
world
isn't this cool?'''and that would print:
Hello
world
isn't this cool?but in your circumstance it might be a little bit difficult with all those format().
Code Snippets
print('''' Hello
world
isn't this cool?'''Hello
world
isn't this cool?Context
StackExchange Code Review Q#131371, answer score: 3
Revisions (0)
No revisions yet.