缺少参数age;PersonNode.__init__() missing 1 required positional argument: 'age'
-
标题:PersonNode.init() missing 1 required positional argument: 'age'
提问模板:说缺少参数,但是感觉没有缺少
Traceback (most recent call last):
File "/home/ros/chapt2_3/chapt2_3_ws/install/demo_python_pkg/lib/demo_python_pkg/writer_node", line 33, in <module>
sys.exit(load_entry_point('demo-python-pkg==0.0.0', 'console_scripts', 'writer_node')())
File "/home/ros/chapt2_3/chapt2_3_ws/install/demo_python_pkg/lib/python3.10/site-packages/demo_python_pkg/writer_node.py", line 10, in main
node = WriterNode('法外狂徒张三', 18, '论快速入狱')
File "/home/ros/chapt2_3/chapt2_3_ws/install/demo_python_pkg/lib/python3.10/site-packages/demo_python_pkg/writer_node.py", line 5, in init
super().init(name, age)
TypeError: PersonNode.init() missing 1 required positional argument: 'age'背景(可选):
[在这里描述你要实现什么,也许有更好的方案]
问题描述:colcon build;
ros@ros-VirtualBox:~/chapt2_3/chapt2_3_ws$ source install/setup.bash
ros@ros-VirtualBox:~/chapt2_3/chapt2_3_ws$ ros2 run demo_python_pkg writer_node
Traceback (most recent call last):
File "/home/ros/chapt2_3/chapt2_3_ws/install/demo_python_pkg/lib/demo_python_pkg/writer_node", line 33, in <module>
sys.exit(load_entry_point('demo-python-pkg==0.0.0', 'console_scripts', 'writer_node')())
File "/home/ros/chapt2_3/chapt2_3_ws/install/demo_python_pkg/lib/python3.10/site-packages/demo_python_pkg/writer_node.py", line 10, in main
node = WriterNode('法外狂徒张三', 18, '论快速入狱')
File "/home/ros/chapt2_3/chapt2_3_ws/install/demo_python_pkg/lib/python3.10/site-packages/demo_python_pkg/writer_node.py", line 5, in init
super().init(name, age)
TypeError: PersonNode.init() missing 1 required positional argument: 'age'具体细节和上下文:
person.py代码
import rclpy
from rclpy.node import Nodeclass PersonNode(Node):
def init(self, node_name: str, name: str, age: int) -> None:
super().init(node_name)
self.age = age
self.name = namedef eat(self, food_name: str): self.get_logger().info(f'我叫{self.name},今年{self.age}岁,我现在正在吃{food_name}')
def main():
rclpy.init()
node = PersonNode('person_node', '法外狂徒张三', '18')
node.eat('鱼香肉丝')
rclpy.spin(node)
rclpy.shutdown()
writer_node.py代码
from demo_python_pkg.person_node import PersonNodeclass WriterNode(PersonNode):
def init(self, name: str, age: int, book: str) -> None:
super().init(name, age)
print('WriterNode 的 init 函数被调用了')
self.book = bookdef main():
node = WriterNode('法外狂徒张三', 18, '论快速入狱')
node.eat('鱼香肉丝')
setup.py
entry_points={
'console_scripts': [
'python_node = demo_python_pkg.python_node:main',
'person_node = demo_python_pkg.person_node:main',
'writer_node = demo_python_pkg.writer_node:main',
],
},
目录展示
尝试过的解决方法:
问了deepseek,按照他的修改,但是显示新的错误,进行修改,继续报错
-
@1635731080 你这个错误的本质是:
TypeError: PersonNode.__init__() missing 1 required positional argument: 'age'
虽然你明明传了
age
,但出错行在WriterNode.__init__()
的super().__init__(name, age)
,这说明它找的super()
不是你想的PersonNode(node_name, name, age)
,而是找错了继承链!
核心问题分析:
你定义的
PersonNode
是:class PersonNode(Node): def __init__(self, node_name: str, name: str, age: int) -> None: super().__init__(node_name) self.age = age self.name = name
然后
WriterNode
是:class WriterNode(PersonNode): def __init__(self, name: str, age: int, book: str) -> None: super().__init__(name, age) # ❌ 你以为你传给 PersonNode(name, age) self.book = book
但是你忘了:
PersonNode
的构造函数需要 三个参数:node_name, name, age
,你只传了两个。
正确写法:
你应该这样调用
PersonNode.__init__
:class WriterNode(PersonNode): def __init__(self, name: str, age: int, book: str) -> None: super().__init__('writer_node', name, age) # ✅ 补上 node_name self.book = book print('WriterNode 的 __init__ 函数被调用了')
这里
'writer_node'
就是 ROS 节点名,随便你取,例如可以换成'author_node'
、'zhangsan_writer'
也行。
总结一句话:
你的
PersonNode.__init__()
要求是:def __init__(node_name, name, age)
但是你只传了两个参数:
super().__init__(name, age) # ❌ 缺了 node_name
因此报错。
修改后完整
WriterNode
:from demo_python_pkg.person_node import PersonNode class WriterNode(PersonNode): def __init__(self, name: str, age: int, book: str) -> None: super().__init__('writer_node', name, age) # ✅ 正确传入三个参数 print('WriterNode 的 __init__ 函数被调用了') self.book = book def main(): import rclpy rclpy.init() node = WriterNode('法外狂徒张三', 18, '论快速入狱') node.eat('鱼香肉丝') rclpy.spin(node) rclpy.shutdown()
如果你还有其他
Node
的继承设计问题,或者希望WriterNode
中动态传入node_name
,也可以优化,我们可以继续改。是否需要我帮你重构让node_name
更灵活?