无法将构造的inv变量传入同类parse_inventory函数,求解决方法
问题:无法将构造的变量inv传递给同类中的另一个函数
我在第6行通过teamInventory.parse_inventory(inv)传递参数,但未被parse_inventory函数接收,报错提示缺少必要的位置参数。请问如何正确将inv传入parse_inventory()?
原代码
class teamInventory: def clone_repo(self): self.team_dev = "dev0" for team_cluster in self.preprod_clusters: inv=str(local_repo_path)+self.team_dev+"/hosts.ini" teamInventory.parse_inventory(inv) return self def repo_checkout(self): try: local_repo_path.exists() and local_repo_path.is_dir() teamInventory.clone_repo(self) except OSError as e: print("Error %s : %s" % (local_repo_path, e.strerror)) return self def parse_inventory(self, cluster_inv): self.server = "team" cro = teamInventory().clone_repo() if cro.team_dev in cluster_inv: print("dev cluster inventory") return self avi.repo_checkout()
错误输出
TypeError: parse_inventory() missing 1 required positional argument: 'cluster_inv'
预期输出
dev cluster inventory
解决方法
问题原因
你用类名直接调用实例方法时,没有手动传入实例对象(self),而实例方法的第一个参数必须是实例本身。比如teamInventory.parse_inventory(inv)只传了inv,但方法需要先接收self,再接收cluster_inv,所以报错缺少参数。
具体修改步骤
调用实例方法用
self替代类名:- 在
clone_repo方法中,把teamInventory.parse_inventory(inv)改成self.parse_inventory(inv),self会自动作为第一个参数传入方法。 - 在
repo_checkout方法中,把teamInventory.clone_repo(self)改成self.clone_repo(),这是实例方法的标准调用方式。
- 在
修正
parse_inventory的逻辑冗余:
方法里新建teamInventory()实例完全没必要,直接用当前实例的self.team_dev即可,避免创建不必要的对象。
修改后的代码
class teamInventory: def clone_repo(self): self.team_dev = "dev0" # 注意:需确保self.preprod_clusters已初始化,否则会报错 for team_cluster in self.preprod_clusters: inv = str(local_repo_path) + self.team_dev + "/hosts.ini" # 用self调用实例方法 self.parse_inventory(inv) return self def repo_checkout(self): try: if local_repo_path.exists() and local_repo_path.is_dir(): # 用self调用实例方法 self.clone_repo() except OSError as e: print("Error %s : %s" % (local_repo_path, e.strerror)) return self def parse_inventory(self, cluster_inv): self.server = "team" # 直接使用当前实例的team_dev,无需新建实例 if self.team_dev in cluster_inv: print("dev cluster inventory") return self # 注意:需确保avi是teamInventory类的实例,比如avi = teamInventory() avi.repo_checkout()
额外注意点
- 要确保
local_repo_path、self.preprod_clusters以及avi实例已正确初始化,否则会出现其他报错。 - 实例方法的标准调用方式是
self.方法名(参数),只有类方法(用@classmethod装饰)才用类名调用。
内容的提问来源于stack exchange,提问作者AhmFM
相关产品推荐
相关产品推荐

