2015-11-25 76 views
-2

嗨我試了很多,我不知道爲什麼當我想要保存haversine() x給我以下錯誤: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) 
+3

'self.haversine' –

+2

它看起來像你的縮進是有點搞砸了。 haversine函數也應該把'self'作爲它的第一個參數,因爲它是一個類方法。你也應該用'self.haversine'呼叫haversine – fabianvf

+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文件中的那樣。

0

您已經在類中聲明瞭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) 

您可以通過更新您的半正矢法採取的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 

另外,如果你不希望包括haversine在類,你可以在同一文件中之前或類定義之後類之外聲明。

# 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 
相關問題