使用IP地址作为参数的函数调用

时间:2014-07-25 05:14:20

标签: python function arguments

我正在使用一个刮刀来检查文件传输的进度,该传输操作在一个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

始终使用第三组数字中的零...

4 个答案:

答案 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.