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

标签 python pep8

阅读一些内容后,我发现自己在使用两种不同的方法将参数列表传递给函数时遇到了困难。我读了一些迹象。这就是我到目前为止的想法:

实际代码:

文件调用者.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)

文件: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

现在我有:

文件调用者.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)

文件: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

使用旧方法(实际代码)我相信仅在一行中调用一个函数会更“友好”(如您在 worker.py 中所见)。但是,使用新方法,我认为代码变得更加广泛,因为我必须为每个函数定义所有相同的变量。但这是最好的做法吗?我仍在缓慢地学习 Python,因此,对于代码中的任何错误,我们深表歉意。

一件重要的事情是,大部分变量都是从数据库中检索的,因此它们不是静态的。

最佳答案

我真的不建议定义像 def version_check(*args): 这样的函数,除非您特别需要。快速,无需阅读源代码:参数的顺序是什么?如何为 proxyServer 指定默认值?请记住,“显式优于隐式”。

有一次我经常偏离这条规则是在我包装另一个函数时,例如:

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

def baz(qux, *args):
    print 'Qux:', qux
    foo(*args)

对于这样一个简单的例子,我永远不会这样做,但假设 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): ...

然后在客户端中,写:

from worker import Worker

w = Worker(iserver,login,password,proxyUser,proxyPass,proxyServer,service)
w.version_check()
w.version_get()
w.version_send()

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

关于python - 传递和处理函数参数的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12844963/

相关文章:

python - 在编写 python 类型注释时处理 79 个字符的限制

python - 使用 yapf 内联注释的间距

python - setFont(Times-Roman) 不能缺少 T1 文件吗?

python - PEP8 - E129 和 E127/E128 之间的矛盾

python - 如何将 python 代码与 SWAT 分水岭模型结合起来

如果互联网连接中断,python + parse.com 上传数据

python - 为什么我应该对 namedtuple 使用 CamelCase?

python - 'py.test' 不是内部或外部命令,也不是可运行的程序或批处理文件

python - 如何在 python 中从 numpy 数组制作图像?

python - elasticsearch-dsl-py 查询格式