Python 为什么我的方法没有';t调用另一个(未定义的变量)
嗨,我尝试了很多,我不知道为什么当我想在x上保存Python 为什么我的方法没有';t调用另一个(未定义的变量),python,django,Python,Django,嗨,我尝试了很多,我不知道为什么当我想在x上保存haversine()时会出现以下错误:未定义变量haversine。它工作的唯一方法是当我把haversine函数放在get funct中 class GetRide(APIView): authentication_classes = (TokenAuthentication,) permission_classes = (IsAuthenticated,) def haversine(lat1, lng1
haversine()
时会出现以下错误:未定义变量haversine
。它工作的唯一方法是当我把haversine函数放在get funct中
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)
class GetRide(APIView):
身份验证\类=(令牌身份验证)
权限\类=(已验证,)
def haversine(lat1、lng1、lat2、lng2):
"""
计算两点之间的大圆距离
地球上(以十进制度数表示)
"""
#将十进制度数转换为弧度
lng1,lat1,lng2,lat2=贴图(弧度,[lng1,lat1,lng2,lat2])
#哈弗森公式
dlng=lng2-lng1
dlat=lat2-lat1
a=sin(dlat/2)**2+cos(lat1)*cos(lat2)*sin(dlng/2)**2
c=2*asin(sqrt(a))
公里=6367*c
返回公里
def get(自我、请求、路由id):
d_route=route.objects.get(id=route_id)
p_routes=Route.objects.all()
对于p_路线中的路线:
x=haversine(d_路线、始发地、d_路线、始发地、始发地、始发地、始发地)
如果(x<3):
新路由=0
返回响应(新路由,状态=status.HTTP\u 200\u OK)
行:
def haversine(lat1, lng1, lat2, lng2):
应该是:
def haversine(self, lat1, lng1, lat2, lng2):
x = self.haversine(d_route.origin_lat,d_route.origin_lng, route.origin_lat, route.origin_lng )
和行:
x = haversine(d_route.origin_lat,d_route.origin_lng, route.origin_lat, route.origin_lng )
应该是:
def haversine(self, lat1, lng1, lat2, lng2):
x = self.haversine(d_route.origin_lat,d_route.origin_lng, route.origin_lat, route.origin_lng )
这是因为它们都位于
类
内部,而且所有函数都应该缩进类
。不确定它是否粘贴错误,或者它实际上是否与.py文件中的一样。您已经在GetRide
类中声明了haversine
函数。在类内部声明它使其成为类的实例方法。必须从类的实例调用实例方法
# 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(...)
假设您没有使用self
参数声明haversine
,这两个调用都会产生以下错误:
TypeError: haversine() takes exactly 4 arguments (5 given)
它说您给了它5,因为python会自动将实例作为lat1
之前的第一个参数传入。真正发生的是:
haversine(my_get_ride, lat1, lng1, lat2, lng2)
您可以通过更新haversine方法来纠正这一问题,如使用get
方法一样,将第一个参数设置为self
,然后从get
方法中,您必须从`self'调用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
或者,如果您不希望在
GetRide
类中包含haversine
,您可以在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
看起来你的缩进有点乱。haversine函数还应将
self
作为其第一个参数,因为它是一个类方法。你也应该用self调用haversine。haversine谢谢为什么我需要它从self调用它?因为它不会被发现,否则,正如你已经发现的那样。