2013-07-03 43 views
0

我有这样的功能:如何修改这个函数来接受三个不同变量的返回?

import os 
import subprocess 

def find_remote_files(hostspec): 
    cmdline = ["rsync", "-e", "ssh", "-r", hostspec] 
    with open(os.devnull, "w") as devnull: 
     proc = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=devnull) 
     try: 
      for entry in proc.stdout: 
       items = entry.strip().split(None, 4) 
       if not items[0].startswith("d"): 
        yield items[4] 
        yield items[1] 
        yield items[2] 
      proc.wait() 
     except: 
      # On any exception, terminate process and re-raise exception. 
      proc.terminate() 
      proc.wait() 
      raise 

这个函数返回三个不同的东西,我想存储在三个不同的变量,如:

a, b, c = find_remote_date('username', 'password') 
# a should hold yield items[4] 
# b should hold yield items[1] 
# c should yield items[2] 

我得到以下错误,当我尝试做即:

ValueError: too many values to unpack 
+1

你为什么认为'yield'比'return'好呢? –

回答

0

您可能认为该函数在产生对象后会中断。它没有。所以for循环将继续,可能会产生更多的值。

你可以把产量报表后return所以功能中断,甚至一次只返回所有这三个值中的元组做return (items[4], items[1], items[2])

+0

文件“/home/zurelsoft/Documents/workspace/genalytics/fileupload/functions.py”,第151行 返回项目[4],返回项目[1],返回项目[2] ^ SyntaxError:无效语法 – user2545177

+0

@ user2545177只需要一个'return'。试试:'return(items [4],items [1],items [2])' – TerryA

1

您可以简单地返回一个元组:

return items[4], items[1], items[2] 

这将导致您需要的abc的分配。

+0

除了'except'外。 –

+0

语法无效。 – user2545177

+1

我不认为上面的代码的语法有任何问题,它相当常见和直接。错误是否特别引用这行代码为无效的? – robjohncox

相关问题