将函数参数作为参数传递给python中的另一个函数

将函数参数作为参数传递给python中的另一个函数,python,Python,我有两个python函数 class JENKINS_JOB_INFO(): def __init__(self): parser = argparse.ArgumentParser(description='xxxx. e.g., script.py -j jenkins_url -u user -a api') parser.add_argument('-j', '--address', dest='address', default="", requ

我有两个python函数

class JENKINS_JOB_INFO():
    def __init__(self):
        parser = argparse.ArgumentParser(description='xxxx. e.g., script.py -j jenkins_url -u user -a api')
        parser.add_argument('-j', '--address', dest='address', default="", required=True, action="store")
        parser.add_argument('-u', '--user', dest='user', default="xxxx", required=True, action="store")
        parser.add_argument('-t', '--api_token', dest='api_token', required=True, action="store")
        parsers = parser.parse_args()

        self.base_url = parsers.address.strip()
        self.user = parsers.user.strip()
        self.api_token = parsers.api_token.strip()
    def main(self):
        logger.info("call the function")
        self.get_jobs_state()
    def get_jobs_state(self):
        get_jenkins_json_data(params)

   def get_jenkins_json_data(self, params, base_url):
        url = urljoin(self.base_url, str(params.params))
        r = requests.get(url, auth=HTTPBasicAuth(self.user, self.api_token), verify=False)
我有一个参数
params
在我的函数
get_jobs_state
中定义,我想把这个参数传递给我的另一个函数
get_jenkins_json_data
,以便完整的
url
内部函数
get_jenkins_json_data
连接到
https:/api/json?pretty=true&tree=jobs[name,color]

但是当我运行代码时,
url
不正确,函数中
params
的值是

这里
base\u url
是我传递给脚本的一个参数


如何消除此错误?

只需编写
params.params
而不是
params

您这样做的方式非常混乱,因为在
get_jenkins_josn_data
中,
self
将是
params
,而
params
将是
基本url
。我劝你以后不要那样做。如果要向函数发送一些参数,请发送函数所需的最少信息量。例如,在这里,您可以发送
self.params
,而不是整个
self
。这样您就不会遇到此错误,代码的可读性也会大大提高


我建议您以这种方式重写此函数。

只需编写
params.params
而不是
params

您这样做的方式非常混乱,因为在
get_jenkins_josn_data
中,
self
将是
params
,而
params
将是
基本url
。我劝你以后不要那样做。如果要向函数发送一些参数,请发送函数所需的最少信息量。例如,在这里,您可以发送
self.params
,而不是整个
self
。这样您就不会遇到此错误,代码的可读性也会大大提高


我建议您以这种方式重写此函数。

在您的函数
get\u jobs\u state
中,您将self作为params参数的参数传递给
get\u jenkins\u json\u data
,在本例中self是一个类的实例

试着这样做:

class Jenkins:

def __init__(self, domain):

    self.user = "user"
    self.api_token = "api_token"
    self.base_domain = domain

def get_jobs_state(self):
    query = "api/json?pretty=true&tree=jobs[name,color]"
    return self.get_jenkins_json_data(query)

def get_jenkins_json_data(self, query):
    url = urljoin(self.base_domain, str(query))
    r = requests.get(url, auth=HTTPBasicAuth(self.user, self.api_token), verify=False)
    return r
def get_jobs_state(self):
    params = "api/json?pretty=true&tree=jobs[name,color]"
    self.get_jenkins_json_data(params)

def get_jenkins_json_data(self, params):
    url = urljoin(self.base_url, params)
    r = requests.get(url, auth=HTTPBasicAuth(self.user, self.api_token), verify=False)
...

在函数
get\u jobs\u state
中,将self作为params参数的参数传递给
get\u jenkins\u json\u data
,在本例中,self是一个类的实例

试着这样做:

class Jenkins:

def __init__(self, domain):

    self.user = "user"
    self.api_token = "api_token"
    self.base_domain = domain

def get_jobs_state(self):
    query = "api/json?pretty=true&tree=jobs[name,color]"
    return self.get_jenkins_json_data(query)

def get_jenkins_json_data(self, query):
    url = urljoin(self.base_domain, str(query))
    r = requests.get(url, auth=HTTPBasicAuth(self.user, self.api_token), verify=False)
    return r
def get_jobs_state(self):
    params = "api/json?pretty=true&tree=jobs[name,color]"
    self.get_jenkins_json_data(params)

def get_jenkins_json_data(self, params):
    url = urljoin(self.base_url, params)
    r = requests.get(url, auth=HTTPBasicAuth(self.user, self.api_token), verify=False)
...

所以你的解决方案有点混乱。您不应该将self传递给
get\u jenkins\u json\u data
方法。python将自动为您执行此操作。您应该检查数据模型的工作原理。我会像这样重构您的代码:

class Jenkins:

def __init__(self, domain):

    self.user = "user"
    self.api_token = "api_token"
    self.base_domain = domain

def get_jobs_state(self):
    query = "api/json?pretty=true&tree=jobs[name,color]"
    return self.get_jenkins_json_data(query)

def get_jenkins_json_data(self, query):
    url = urljoin(self.base_domain, str(query))
    r = requests.get(url, auth=HTTPBasicAuth(self.user, self.api_token), verify=False)
    return r
def get_jobs_state(self):
    params = "api/json?pretty=true&tree=jobs[name,color]"
    self.get_jenkins_json_data(params)

def get_jenkins_json_data(self, params):
    url = urljoin(self.base_url, params)
    r = requests.get(url, auth=HTTPBasicAuth(self.user, self.api_token), verify=False)
...

所以你的解决方案有点混乱。您不应该将self传递给
get\u jenkins\u json\u data
方法。python将自动为您执行此操作。您应该检查数据模型的工作原理。我会像这样重构您的代码:

class Jenkins:

def __init__(self, domain):

    self.user = "user"
    self.api_token = "api_token"
    self.base_domain = domain

def get_jobs_state(self):
    query = "api/json?pretty=true&tree=jobs[name,color]"
    return self.get_jenkins_json_data(query)

def get_jenkins_json_data(self, query):
    url = urljoin(self.base_domain, str(query))
    r = requests.get(url, auth=HTTPBasicAuth(self.user, self.api_token), verify=False)
    return r
def get_jobs_state(self):
    params = "api/json?pretty=true&tree=jobs[name,color]"
    self.get_jenkins_json_data(params)

def get_jenkins_json_data(self, params):
    url = urljoin(self.base_url, params)
    r = requests.get(url, auth=HTTPBasicAuth(self.user, self.api_token), verify=False)
...


urljoin
的参数中,使用
self.params
,而不是从
get\u jobs\u state
中给出的
params
时,使用
get\u jenkins\u json\u data
是故意的吗,我必须在
def\uuu init\uuuu(self):
中声明
self.params=[]
。如果我不这样做,我的脚本就会失败,出现
错误
AttributeError:CLASSNAME实例没有属性“params”
您可以这样调用方法
self。是否有意获取\u jenkins\u json\u数据(self,params)
?因为这样,
self
将是
params
params
将是
base\u url
。如果必须在其他地方使用该变量,则@AttilaBognár的方式更好,最好先初始化,然后在类中使用它instance@AttilaBognár我不熟悉这个
self
关键字,所以我不知道调用
self.get\u jenkins\u json\u data(self,params)
是否不正确是故意给
get\u jenkins\u json\u data
提供
params
,但在
urljoin
的参数中使用了
self.params
,在
get_jobs\u state
给出的
params
上,无论我是在
urljoin
中使用
self.params
还是仅仅在
urljoin
中使用
self.params=[]
都没有区别,我必须在
def\uu init\uuu(self):
中声明
。如果我不这样做,我的脚本就会失败,出现
错误
AttributeError:CLASSNAME实例没有属性“params”
您可以这样调用方法
self。是否有意获取\u jenkins\u json\u数据(self,params)
?因为这样,
self
将是
params
params
将是
base\u url
。如果必须在其他地方使用该变量,则@AttilaBognár的方式更好,最好先初始化,然后在类中使用它instance@AttilaBognár我不熟悉这个
self
关键字,因此,我不知道调用self.get_jenkins_json_data(self,params)
是否正确,但我的基本域会根据需求不断变化,对于每个更新过的代码来说都不一样。将其移动到构造函数,这样您就可以为任何域创建Jenkins的实例。此代码也可以使用。非常感谢您的帮助:)但是我的基本域会根据需求不断变化,不同于每一个更新的代码。将其移动到构造函数,这样您就可以为任何域创建Jenkins的实例。此代码也可以使用。非常感谢你的帮助:)是的,这个很有魅力。非常感谢你的帮助:)是的,这个很有魅力。非常感谢您的帮助……)