Преобразование функции Python 2 в Python 3

#python #python-3.x #python-2.7

#python #python-3.x #python-2.7

Вопрос:

Я получил следующую функцию из старого проекта и получаю эту ошибку

def haversine_distance((lat1, lon1), (lat2, lon2)): ^ Ошибка синтаксиса: недопустимый синтаксис

 def haversine_distance((lat1, lon1), (lat2, lon2)):
    """
    Haversine distance between two points, given by lon and lat in degrees.
    """

    d_lat = radians(lat2 - lat1)
    d_lon = radians(lon2 - lon1)

    a = sin(d_lat / 2.0) ** 2   
        cos(radians(lat1)) * cos(radians(lat2)) * 
        sin(d_lon / 2.0) ** 2

    c = 2 * atan2(sqrt(a), sqrt(1 - a))

    return R * c
  

Я хотел бы знать, как преобразовать это в лучшие практики python 3.8. Справка

Ответ №1:

Определите свою функцию как haversine_distance(p1, p2) в Python3 и распакуйте lat, lon в теле функции. Например:

 def haversine_distance(p1, p2):
    """
    Haversine distance between two points, given by lon and lat in degrees.
    """
    lat1, lon1 = p1
    lat2, lon2 = p2

    d_lat = radians(lat2 - lat1)
    d_lon = radians(lon2 - lon1)

    a = sin(d_lat / 2.0) ** 2   
        cos(radians(lat1)) * cos(radians(lat2)) * 
        sin(d_lon / 2.0) ** 2

    c = 2 * atan2(sqrt(a), sqrt(1 - a))

    return R * c
  

Ответ №2:

Расширяя ответ @AndrejKesely и для более читаемого кода, я бы определил namedtuple Point с lat и lon полями. а затем работать с ними

 from collections import namedtuple
from math import radians, sin, cos, atan2, sqrt

Point = namedtuple('Point', 'lat, lon')

def haversine_distance(point1, point2):
    """
    Haversine distance between two points, given by lon and lat in degrees.
    """

    d_lat = radians(point2.lat - point1.lat)
    d_lon = radians(point2.lon - point1.lon)
    a = sin(d_lat / 2.0) ** 2   cos(radians(point1.lat)) * cos(radians(point2.lat)) * sin(d_lon / 2.0) ** 2
    c = 2 * atan2(sqrt(a), sqrt(1 - a))

    return R * c # assuming R is global constant 

point1 = Point(42, 23)
point2 = Point(41, 23)
print(haversine_distance(point1, point2))