将函数参数作为参数传递给python

时间:2018-12-17 06:56:33

标签: 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="", 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,以便函数{{ 1}}加入url

但是当我运行代码时,get_jenkins_json_data是不正确的,函数内的https:<jenkins>/api/json?pretty=true&tree=jobs[name,color]的值为url

这里params是我要传递给脚本的参数。

如何摆脱这个错误?

3 个答案:

答案 0 :(得分:2)

只需写params.params而不是params

您的操作方式非常混乱,因为在get_jenkins_josn_data中,self将是params,而params将是base_url。我建议您以后不要这样做。如果要向该函数发送一些参数,请发送该函数所需的最少信息。例如,在这里,您可能发送了self.params而不是整个self。这样,您就不会遇到此错误,并且代码将更具可读性。

我建议您以这种方式重写此功能。

答案 1 :(得分:1)

在函数get_jobs_state中,您将self作为get_jenkins_json_data的params参数的参数传递,在这种情况下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

答案 2 :(得分:1)

因此您的解决方案有点混乱。您不应该将自身传递给get_jenkins_json_data方法。 python会自动为您执行此操作。您应该检查数据模型以了解instance methods的工作方式。我会像这样重构您的代码:

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)
...