Star Wars API GET request in Python I am working with a Star Wars API from http://swapi.co/api/. Here's the problem that I was working on for the Star Wars API problem. And the code works and prints out the exact output that I desired. I would like to get some code review.


&gt;

# You are a Coordinator for the Star Wars rebel forces and are responsible for planning troop deployments.
# You need a tool to help find starships with enough passenger capacity and pilots to fly them.



# Build a CLI tool that takes as its single argument the number of people that
# need to be transported and outputs a list of candidate pilot and starship names
# that are each a valid possibility.
# Assume that any pilot can be a candidate regardless of allegiance.
# Assume the entire group of passengers must fit in a single starship.

# You may skip starships with no pilots or with unknown passenger capacity.
# Your tool must use the Star Wars API (http://swapi.co) to obtain the necessary data.

# You may not use any of the official Star Wars API helper libraries but can use any other libraries you want
# (http client, rest client, json).

  
  Example:


&gt; # print-pilots-and-ships with minimum of 20 passengers
&gt;
&gt; # Luke Skywalker, Imperial shuttle
&gt;
&gt; # Chewbacca, Imperial shuttle
&gt;
&gt; # Han Solo, Imperial shuttle
&gt;
&gt; # Obi-Wan Kenobi, Trade Federation cruiser
&gt;
&gt; # Anakin Skywalker, Trade Federation cruiser


Python 3 solution:

import sys
import requests
import json
import urllib.parse

#number of pages in JSON feed

def print_page(page_num, num_passenger):
    endpoint = "https://swapi.co/api/starships/?"
    type = 'json'

    #specifies api parameters
    url = endpoint + urllib.parse.urlencode({"format": type, "page": page_num})

    #gets info
    json_data = requests.get(url).json()
    # number_of_ship = json_data['count']
    if 'results' in json_data:
      for ship in json_data['results']:
          if has_pilot(ship) and has_enough_passenger(ship, num_passenger):
              print_pilots_on(ship)

def get_pilot_name(pilot):
    type = 'json'

    #specifies api parameters
    url = pilot

    #gets info
    json_data = requests.get(url).json()
    return json_data["name"]

def print_pilots_on(ship):
    for pilot in ship['pilots']:
       print(get_pilot_name(pilot), ship['name'])

def has_pilot(ship):
    if ship['pilots']:
      return True
    return False

def has_enough_passenger(ship, num):
    if ship['passengers'] != "unknown" and int(ship['passengers']) &gt;= num:
      return True
    return False

def print_pilots_and_ships(num_passenger):

    page_list = [1,2,3,4,5,6,7,8,9]
    # list to store names

    for page in page_list:
        print_page(page, num_passenger)


if __name__ == '__main__':
    num_passenger = int(20)
    print_pilots_and_ships(num_passenger)
This is pretty good. I only have a few small nitpicks


Return directly

You do this a few times:


 if ship['passengers'] != "unknown" and int(ship['passengers']) &gt;= num:
    return True
return False



The above can be rewritten as:

return ship['passengers'] != "unknown" and int(ship['passengers']) &gt;= num

Superfluous int call

int(20), here the int call does nothing, 20 is already an integer.
You can get more out of the request module.

Python's requests lib is very powerful and has a lot of features you can use.

It supports adding params for instance, so instead of:


#specifies api parameters
url = endpoint + urllib.parse.urlencode({"format": type, "page": page_num})
#gets info
json_data = requests.get(url).json()



You could do:

json_data = requests.get(endpoint, params={"format": "json", "page": page_num}).json()

Remove unused imports

sys module is not used, I suggest removing it.