【问题标题】:Passing arguments to a method with cmd module使用 cmd 模块将参数传递给方法
【发布时间】:2017-07-10 10:16:48
【问题描述】:

我正在尝试使用 cmd 模块在 Python 中编写自己的 shell,即使在互联网上阅读了数百个主题后,我也不知道如何解决我的问题。

def do_triangle_area(a, h):
    "Calculating tiangle's field"
    print (1/2*a)*h

我只想通过启动程序和键入时通过命令行传递“a”和“h”参数

$ tiangle_area 5 2

它应该返回结果,但是有一个错误:

Traceback (most recent call last):
  File "test8.py", line 75, in <module>
    CMD().cmdloop()
  File "/usr/lib/python2.7/cmd.py", line 142, in cmdloop
    stop = self.onecmd(line)
  File "/usr/lib/python2.7/cmd.py", line 221, in onecmd
    return func(arg)
  File "test8.py", line 17, in do_triangle_area
    print (a*b)
TypeError: object cannot be interpreted as an index

我试图添加一个 self 参数

def do_triangle_area(self, a, h):
        "Calculating tiangle's field"
        print (1/2*a)*h

但它也不起作用:

Traceback (most recent call last):
  File "test8.py", line 75, in <module>
    CMD().cmdloop()
  File "/usr/lib/python2.7/cmd.py", line 142, in cmdloop
    stop = self.onecmd(line)
  File "/usr/lib/python2.7/cmd.py", line 221, in onecmd
    return func(arg)
TypeError: do_triangle_area() takes exactly 3 arguments (2 given)

一切都在一个类中,导入的 cmd 模块。当它是一个论点时一切都好 - 检查,工作出色,但它无法为我计算任何东西。但为什么它不能处理来自用户的超过 1 个参数?效果如何?

在这种情况下我该怎么办?请给我任何提示,因为我正在把头撞到墙上......

编辑:完整代码http://pastebin.com/3EVBbvfN EDIT2:粘贴过期 - 新粘贴:http://pastebin.com/3wM021s1

【问题讨论】:

  • 包含def onecmd 的代码或您解析该行的位置
  • [pastebin.com/3EVBbvfN]我不知道你在问什么,所以我包括了整个代码
  • 拜托,谁能帮帮我?
  • 您的 pastebin 不是有效的 python:do_triangle_area 接受 a & b 并使用 a & h
  • 不不不,这不是问题所在。这是一个快速粘贴,但这不是重点。我的观点是如何使用 cmd 模块传递两个参数?例如。计算三角形面积还是简单地将两个整数相加?

标签: python python-2.7 methods


【解决方案1】:

当你不明白发生了什么时,只需添加痕迹。

def do_triangle_area(a, h):
        "Calculating tiangle's field"
        print(a, type(a), h, type(h))
        print (1/2*a)*h

会显示如下内容:

<__main__.CMD object at 0x...> <class '__main__.CMD'> 2 4 <class 'str'>

现在很明显do_triangle_area 接收 2 个参数,Cmd 对象作为 self 和一个包含命令剩余部分的单个字符串。所以你必须写:

def do_triangle(self, line):
    "Calculating tiangle's field"
    # print(self, type(self), line, type(line)) uncomment for debug
    a,h = [float(s) for s in line.split()]
    print (1/2*a)*h

【讨论】:

    猜你喜欢
    • 2012-02-03
    • 2017-12-01
    • 2022-01-05
    • 2018-09-29
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多