3

在 main() 中,根据前一个函数退出状态的条件调用一系列函数的最佳方式是什么?我可以做

if function foo(x, ssh) == True:
       if function bar(x.info, ssh) == True:
           if function foobar(x.info, ssh)

但我宁愿用一种更有效的方式来做,比如将函数(及其参数)放在一个不可变列表中,并让它们在退出状态为 True 时循环迭代。还是 python 有一些更好的糖语法?

import pdb
import paramiko
import time
import sys
from collections import OrderedDict


class GetInfo():
    def __init__(self):
        self.info = OrderedDict([('count', None),
                     ('file_name_filename', ' '),
                     ('continute', ' '),
                     ('filename', None)])

        self.login_info = OrderedDict([('username', 'user'),
                                       ('hostname', '50.223.222.111'),
                           ('password', 'password')])

        epoch_birth = 15842
        epoch_birth = 15842
        count_start = 5555
        current_epoch = int(round(time.mktime(time.localtime())/86400))
        count = str((current_epoch - epoch_birth) + count_start)
        self.info["count"] = count

        fname = "/d2/file_name"+count
        self.info["filename"] = fname

    def login_name(self):
        name = raw_input("Enter Login Name: ")
        self.login_info["login_name"] = name
    def host_name(self): 
        name = raw_input("Enter Host Name: ")
        self.login_info["host_name"] = name
    def password(self):
        name = raw_input("Enter Password: ")
        self.login_info["password"] = name
    def fname(self):
        name = raw_input("Enter Filename and aboslute path: ")
        self.info["password"] = name

def login(object_dict):
        hostname = object_dict['hostname']
    username = object_dict['username']
    password = object_dict['password']
    port = 5777
    try: 
            ssh=paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ssh.connect( hostname, port, username, password)
        return ssh
    except paramiko.AuthenticationException:
        print "Wrong username/password PUNK!"
        return False
    except: 
        print "Could not connect!"
        return False

def read_log(exit_status, stdin, stdout, stderr):
    if exit_status:
        output = stderr.readlines()
    else:
        output = stdout.readlines()
    return ''.join(output)

def get_file(object_dict, ssh):
    stdin, stdout, stderr=ssh.exec_command("bash -c 'ls -al $1' -- " + object_dict["filename"])
    for i in object_dict:
        stdin.write(object_dict[i]+"\n")
        stdin.flush()
    exit_status = stdout.channel.recv_exit_status()
    print exit_status 
    print read_log(exit_status, stdin, stdout, stderr)
    ssh.close()

def create(object_dict, ssh):
    stdin, stdout, stderr=ssh.exec_command("/home/one/file_nameslice.sh")
    for i in object_dict:
        stdin.write(object_dict[i]+"\n")
        stdin.flush()
    exit_status = stdout.channel.recv_exit_status()
    print read_log(exit_status, stdin, stdout, stderr)
    ssh.close()



def main():
    x = GetInfo()
    ssh = login(x.login_info)
    if ssh:
            get_file(x.info, ssh)

main()
4

2 回答 2

2

您可以使用和加入这些函数,例如:

def foo(arg):
    if arg > 2:
        print True, arg
        return True
    else:
        print False, arg
        return False

foo(4) and foo(3) and foo(2) and foo(1)

只有当前一个函数返回 true 时,才会调用下一个函数。所以输出是:

True 4
True 3
False 2
于 2013-05-24T04:47:27.840 回答
1

我最终将 lambda 函数放在一个列表中,并根据函数的返回值在循环中调用每个函数。

functions = [ lambda: create(x.info, ssh), lambda: check_file(x.info, ssh), lambda: get_file(x.info, ssh) ] 

        for i in functions:
            if i():
                print "Operation stopped because of Error!"
                break
于 2013-05-31T08:41:38.697 回答