传递和处理函数参数的最佳方法

tcp*_*008 5 python pep8

经过一些阅读,我发现自己正在努力使用两种不同的方法将一个参数列表传递给一个函数.我读了一些迹象.这就是我到目前为止所知道的:

实际代码:

file caller.py:

import worker
worker.version_check(iserver,login,password,proxyUser,proxyPass,
  proxyServer,packageInfo)

worker.version_get(iserver,login,password,proxyUser,proxyPass,
  proxyServer,packageInfo)

worker.version_send(iserver,login,password,proxyUser,proxyPass,
  proxyServer,packageInfo)
Run Code Online (Sandbox Code Playgroud)

文件:worker.py:

def version_check(iserver,login,password,proxyUser,proxyPass,proxyServer,service):
    #code and more code

def version_get(iserver,login,password,proxyUser,proxyPass,proxyServer,service):
     #code and more code

def version_send(iserver,login,password,proxyUser,proxyPass,proxyServer,service):
    #code and more code
Run Code Online (Sandbox Code Playgroud)

现在我有:

file caller.py:

import worker
args = (env, family, host, password, prefix, proxyServer,
        proxyUser, proxyPass, option, jokerVar
       )
worker.version_check(*args)
worker.version_get(*args)
worker.version_send(*args)
Run Code Online (Sandbox Code Playgroud)

文件:worker.py:

def version_check(*args):
  env = args[0]
  family = args[1]
  host = args[2]
  password = args[3]
  prefix = args[4]
  proxyServer = args[5]
  proxyUser = args[6]
  proxyPass = args[7]
  option = args[8]
  jokerVar = args[9]

  #code and more code

def version_get((*args):
  env = args[0]
  family = args[1]
  host = args[2]
  password = args[3]
  prefix = args[4]
  proxyServer = args[5]
  proxyUser = args[6]
  proxyPass = args[7]
  option = args[8]
  jokerVar = args[9]

  #code and more code

def version_send(*args):
  env = args[0]
  family = args[1]
  host = args[2]
  password = args[3]
  prefix = args[4]
  proxyServer = args[5]
  proxyUser = args[6]
  proxyPass = args[7]
  option = args[8]
  jokerVar = args[9]

  #code and more code
Run Code Online (Sandbox Code Playgroud)

使用老方法(实际的代码),我相信这是更"友好"调用函数中只有一行(因为你可以看到worker.py).但是,使用新方法,我认为代码变得更加广泛,因为对于每个函数,我必须定义所有相同的变量.但这是最好的做法吗?我仍然在缓慢的曲线上学习Python,所以,对不起代码中的任何错误.

还有一件重要的事情是,大多数变量都是从数据库中检索出来的,所以它们并不是唯一的.

Kir*_*ser 6

我真的不建议定义函数,def version_check(*args):除非你特别需要.快速,无需阅读来源:参数的顺序是什么?如何为proxyServer指定默认值?请记住,"明确胜过隐性".

有一次我经常偏离这个规则是当我包装另一个函数时:

def foo(bar):
    print 'Bar:', bar

def baz(qux, *args):
    print 'Qux:', qux
    foo(*args)
Run Code Online (Sandbox Code Playgroud)

我从来没有为这样一个简单的例子做过,但假设foo是一个来自我控制之外的第三方软件包的函数,包含许多默认值,关键字参数等.在这种情况下,我宁愿将参数解析为Python而不是自己尝试.

就个人而言,我会把它写成一个类:

class Worker(object):
    def __init__(iserver,login,password,proxyUser,proxyPass,proxyServer,service):
        self.iserver = iserver
        self.login = login
        self.password = password
        self.proxyUser = proxyUser
        self.proxyPass = proxyPass
        self.proxyServer = proxyServer
        self.service = service

    def version_check(self): ...

    def version_get(self): ...

    def version_send(self): ...
Run Code Online (Sandbox Code Playgroud)

然后在客户端写下:

from worker import Worker

w = Worker(iserver,login,password,proxyUser,proxyPass,proxyServer,service)
w.version_check()
w.version_get()
w.version_send()
Run Code Online (Sandbox Code Playgroud)

如果你真的需要编写带有大量参数的函数而不是在类中封装该状态 - 这是一种更典型的Pythonic方法 - 那么请考虑最近Python版本的namedtuple数据类型.它允许您指定一个元组,其中的项目可以通过关键字进行寻址,并且可以生成一些非常干净,优雅的代码.