Ошибка синтаксиса: неверный синтаксис (<строка>)
У меня есть Python 2.7, и у меня есть скрипт погоды, который возвращает информацию о температуре, я хотел бы внедрить этот скрипт в PostgreSQL. Я всегда получаю эту ошибку: DETAIL: SyntaxError: invalid syntax (<string>, line 10)
код:
CREATE OR REPLACE FUNCTION GetWeather(lon float, lat float)
RETURNS float
AS $$
import urllib2
import simplejson as json
data = urllib2.urlopen(
"http://api.openweathermap.org/data/2.1/find/station?lat=%s&lon=%s&cnt=1"% (lat, lon))
js_data = json.load(data)
if js_data['cod'] == '200':
if int(js_data['cnt'])>0:
station = js_data['list'][0]
print 'Data from weather station %s' %station['name']
if 'main' in station:
if 'temp' in station['main']:
temperature = station['main']['temp'] - 273.15
else:temperature = None
else:temperature = None
return temperature
$$ LANGUAGE plpythonu;
Я тоже пробовал эту версию, но она не работает
CREATE OR REPLACE FUNCTION GetWeather(lon float, lat float)
RETURNS float
AS $$
import urllib2
import simplejson as json
def get_temp(lat, lon):
data = urllib2.urlopen(
"http://api.openweathermap.org/data/2.1/find/station?lat=%s&lon=%s&cnt=1"% (lat, lon))
js_data = json.load(data)
try:
return js_data['list'][0]['main']['temp']
except (KeyError, IndexError):
return None
$$ LANGUAGE plpythonu;
2 ответа
Решение
У меня есть только plpython3u
, но это также должно работать для Python 2.7, используя plpythonu
(просто измените эту часть ниже и ничего больше).
CREATE OR REPLACE FUNCTION GetWeather(lon float, lat float)
RETURNS float AS $$
import sys
if sys.version_info[0] == 2:
from urllib2 import urlopen
else: # Python 3
from urllib.request import urlopen
import json
def get_temp(lon, lat):
data = urlopen(
"http://api.openweathermap.org/data/2.1/find/station?lat=%s&lon=%s&cnt=1"
% (lat, lon))
js_data = json.loads(data.read().decode('utf-8'))
try:
return js_data['list'][0]['main']['temp']
except (KeyError, IndexError):
return None
return get_temp(lon, lat)
$$ LANGUAGE plpython3u;
Обратите внимание, что вышеприведенное относится к условию отступа в 4 пробела (PEP 8). Если вы новичок в Python, я бы рекомендовал пройти несколько уроков, чтобы понять синтаксис и использование отступов.
Вы неправильно поняли структуру данных (да, отступы имеют значение...) В любом случае, вот решение для вас:
def get_temp(lat, lon):
data = urllib2.urlopen(
"http://api.openweathermap.org/data/2.1/find/station?lat=%s&lon=%s&cnt=1"% (lat, lon))
js_data = json.load(data)
try:
return js_data['list'][0]['main']['temp']
except (KeyError, IndexError):
return None
Выход:
In [121]: get_temp(50,50)
Out[121]: 275.15