为什么我的方法不会调用另一个(未定义的变量)

时间:2015-11-25 19:55:31

标签: python django

您好我尝试了很多但我不知道为什么当我想在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)

2 个答案:

答案 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