您好我尝试了很多但我不知道为什么当我想在x上保存haversine()
时会出现以下错误:undefined Variable Haversine
。当我在其中放入半身函数时,它唯一的工作方式就是获取功能
class GetRide(APIView):
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
def haversine(lat1, lng1, lat2, lng2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# convert decimal degrees to radians
lng1, lat1, lng2, lat2 = map(radians, [lng1, lat1, lng2, lat2])
# haversine formula
dlng = lng2 - lng1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlng/2)**2
c = 2 * asin(sqrt(a))
km = 6367 * c
return km
def get(self, request, route_id):
d_route = Route.objects.get(id=route_id)
p_routes = Route.objects.all()
for route in p_routes:
x = haversine(d_route.origin_lat,d_route.origin_lng, route.origin_lat, route.origin_lng )
if ( x < 3):
new_route = 0
return Response(new_route,status=status.HTTP_200_OK)
答案 0 :(得分:0)
行:
def haversine(lat1, lng1, lat2, lng2):
应该是:
def haversine(self, lat1, lng1, lat2, lng2):
和行:
x = haversine(d_route.origin_lat,d_route.origin_lng, route.origin_lat, route.origin_lng )
应该是:
x = self.haversine(d_route.origin_lat,d_route.origin_lng, route.origin_lat, route.origin_lng )
这是因为它们都存在于Class
内部,所有函数也应该缩进Class
。不确定它是否被错误地粘贴,或者它是否真的像.py文件中那样。
答案 1 :(得分:0)
您已在haversine
类中声明了GetRide
函数。在类中声明它使它成为类的实例方法。必须从类的实例调用实例方法。
# Call it directly from a `GetRide` instance
my_get_ride = GetRide() # create an instance of the class
my_get_ride.haversine(lat1, lng1, lat2, lng2) # call it from the instance
# Or call it from within another method of `GetRide` from self
def get(self, ...):
self.haversine(...)
鉴于您尚未使用haversine
参数声明self
,这两个调用都会出现此错误:
TypeError: haversine() takes exactly 4 arguments (5 given)
它说你给它5因为python会自动传入实例作为lat1
之前的第一个参数。真正发生的是:
haversine(my_get_ride, lat1, lng1, lat2, lng2)
您可以通过更新您的半身像方法来更正此问题,以便使用self
方法获取get
的第一个参数,然后使用get
方法调用haversine
方法def haversine(self, lat1, lng1, lat2, lng2):
# method body
def get(self, request, route_id):
# first part of method body
x = self.haversine(d_route.origin_lat,d_route.origin_lng, route.origin_lat, route.origin_lng )
# second part of method body
1}}来自`self。
haversine
或者,如果您不希望在GetRide
类中包含GetRide
,则可以在# here it is defined outside of the class
def haversine(lat1, lng1, lat2, lng2):
# method body
class GetRide(APIView):
# other code
def get(self, request, route_id):
# method body
类定义之前或之后在同一文件中的类之外声明它。
enabledDates