语法错误:无效的语法 (<string>)

0 投票
2 回答
27580 浏览
提问于 2025-04-17 22:35

我有一个使用 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 个回答

0

你搞错了数据结构(没错,缩进很重要……)

不过,这里有个解决方案给你:

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
1

我只有 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,建议先看看一些教程,了解一下语法和缩进的用法。

撰写回答