Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的方法没有';t调用另一个(未定义的变量)_Python_Django - Fatal编程技术网

Python 为什么我的方法没有';t调用另一个(未定义的变量)

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

嗨,我尝试了很多,我不知道为什么当我想在x上保存
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调用它?因为它不会被发现,否则,正如你已经发现的那样。