完全披露,我对编程完全陌生,所以我提前道歉。我正在研究这个python脚本,它将获得用户输入并在某些OS命令中使用该输入(ping,traceroute,whois)。它不完整,但这是脚本:
#!/usr/bin/python
from os import system
def pingz():
system('ping -c 5 %(ab)s' % locals())
def trace_route():
system('traceroute %(cd)s' % locals())
print("My Web Utility:")
print("____________________\n")
print(" 1)Ping a website/IP Address.\n")
print(" 2)Trace the route to a website/IP Address.\n")
print(" 3)Whois inforation.\n")
choice = raw_input("What would you like to do? \n")
if choice == '1':
ab = raw_input("Please enter the Domain Name/IP Address:\n")
pingz()
elif choice == '2':
cd = raw_input("Please enter the Domain Name/IP Address:\n")
trace_route()
我在每个“选择”上都遇到两个错误。所以例如,如果我输入1,我会得到一个提示,询问域名/ IP地址,当我输入它时,我得到的错误是:
Traceback (most recent call last):
File "./test2.py", line 19, in <module>
pingz()
File "./test2.py", line 6, in pingz
system('ping -c 5 %(ab)s' % locals())
KeyError: 'ab'
非常类似的错误选择2.我是如何调用函数的?有人能指出我正确的方向吗?我已经尝试过这个脚本的较小实现(没有自己的功能),没有其他/ elif语句,它工作正常...对不起,很长的帖子,并提前感谢!
答案 0 :(得分:2)
locals是指当前帧,其中未定义ab
。它位于globals()
,
你可以像这样访问它:
def pingz():
system('ping -c 5 %(ab)s' % globals())
答案 1 :(得分:1)
函数中没有任何局部变量,因此locals()
是一个空字典,因此它会引发KeyError
。
您应该简单地将变量传递给函数,而不是依赖于locals()
(或globals()
):
def pingz(host):
system('ping -c 5 %s' % host)
.
.
.
ab = raw_input("Please enter the Domain Name/IP Address:\n")
pingz(ab)
与使用locals()
或globals()
相比,该方法更为可取。
它更易读,更清晰,更不容易出错,特别是如果您计划在函数内修改可变对象。
此外,由于globals
和locals
都是必需的字典,它们会强制您使用唯一的变量名称,并且没有理由说2个函数应该具有其局部变量的唯一名称(例如你的ping和traceroute函数都应该有一个名为host
)的变量。