我在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
是我要传递给脚本的参数。
如何摆脱这个错误?
答案 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)
...