我正在使用一个刮刀来检查文件传输的进度,该传输操作在一个IP地址的摘要列表中运行。文件完成后,我希望从IP的腌制列表中删除IP地址,并将其移至单独的腌制列表中,"完成"。
起点。:
servers = {"10.10.10.1": "", "10.10.10.2": "", "10.10.10.3": ""}
skeys = servers.keys()
complete = []
def donewith(server):
if server in skeys:
complete.append("{0}".format(server))
servers.pop("{0}".format(server))
logging.info('Moved {0} to Complete list.'.format(server))
else:
logging.error('Unable to move \'{0}\' to Complete list.'.format(server))
期望的结果:
donewith(10.10.10.1)
servers = {"10.10.10.2": "", "10.10.10.3": ""}
complete = ["10.10.10.1"]
这就是我实际得到的。
donewith(10.10.10.1)
File "<stdin>", line 1
donewith(10.10.10.1)
^
SyntaxError: invalid syntax
或者用引号调用函数会产生TypeError requiring an integer.
不太确定如何解决这个问题,因为它看起来像是一个简单的问题
详细说明报价解决方案:
def check(server):
#print "Checking {0}".format(server)
logging.info('Fetching {0}.'.format(server))
response = urllib2.urlopen("http://"+server+"/avicapture.html")
tall = response.read() # puts the data into a string
html = tall.rstrip()
match = re.search('.*In Progress \((.*)%\).*', html)
if match:
temp = match.group(1)
results = temp
servers[server] = temp
if int(temp) >= 98 and int(temp) <= 99:
abort(server)
alertmail(temp, server)
donewith(server)
logging.info('{0} completed.'.format(server))
return str(temp)
else:
logging.error('Unable to find progress for file on {0}.'.format(server))
return None
这个函数调用donewith()
函数,如果函数有引号如donewith("server")
,则该函数不起作用。
示例:
def check(server):
donewith("server")
def donewith(server)
do_things.
check(server)
导致..
check(10.10.10.3)
^
SyntaxError: invalid syntax
始终使用第三组数字中的零...
答案 0 :(得分:1)
键是一个字符串。你应该这样做:
donewith('10.10.10.1')
答案 1 :(得分:1)
由于10.10.10.1
不是字符串,因为.
不是字符串,并且python看到点donewith("10.10.10.1")
servers = {"10.10.10.2": "", "10.10.10.3": ""}
complete = ["10.10.10.1"]
,它会尝试将其解析为float,但float只能有一个小数分数,这就是为什么异常指向第二个点之后的数字。
要使其工作,您需要将参数传递为字符串:
donewith
,不仅在check
中,而且在def check(server): # here server is variable name, not a string
donewith(server)
def donewith(server)
do_things.
check(server) # server = "10.10.10.1"
# or
check("10.10.10.1")
中:
{{1}}
因为它是python的工作原理,你需要用引号声明字符串,否则它将被视为数字(第一个字符是数字)或变量名。
答案 2 :(得分:0)
试试这个
In [6]: def donewith(server):
...: if server in skeys:
...: complete.append(server)
...: servers.pop(server)
...: logging.info('Moved {0} to Complete list.'.format(server))
...: else:
...: logging.error('Unable to move \'{0}\' to Complete list.'.format(server))
...:
In [7]: donewith("10.10.10.1")
In [8]:
In [8]: servers
Out[8]: {'10.10.10.2': '', '10.10.10.3': ''}
答案 3 :(得分:0)
只是为了跟进这一点。在其他答案中忽略了一个函数不能调用具有IP地址的另一个函数作为arg,因为句点的数量使它不是字符串。即使在func中调用func(str(ip))也行不通。
我采取了不同的策略并决定定位条目的索引,而不是条目名称本身。
解决方案:
servers = {"10.10.10.1": "", "10.10.10.2": "", "10.10.10.3": ""}
skeys = servers.keys() # Creates list of dictionary keys (IP addresses)
["10.10.10.1", "10.10.10.2", "10.10.10.3"]
for i, j in enumerate(skeys): # Find the index
if j == server:
skeys.pop(i) # Pop the index.
servers = servers.fromkeys(skeys, "") # Recreates server dict from skeys.