Pythonic创建两个函数调用的简单和复杂版本的方法(即重载函数)

时间:2017-05-27 01:34:02

标签: python

我有两个我想要使用的功能:复杂版本和简单版本。

复杂:u.upload("name2", "cat2", "mod2")

简单u.upload("name2")

我想将.py文件中的默认参数保留为globals。

uploader.py

category_s = ""
model_s = ""

def upload(name, category = category_s, model = model_s):
    print(name, category, model)
    upload(name, category, model, author, asRoot = True)

script.py

import uploader as u

u.category_s = "cat1"
u.model_s = "mod1"
u.upload("name1")
u.upload("name2", "cat2", "mod2")

输出

name1 
name2, cat2, mod2

期望输出

name1, cat1, mod1
name2, cat2, mod2

就像def上传(category = category_s )没有看到category_s一样。我曾尝试将category_s称为全局,但它仍然无法正常工作。

有没有一种pythonic方式实现这一目标?在另一种语言中,我会重载上传函数并创建一个类来保存类别和模型变量。我以为我能够使用参数赋值和顶部的全局变量来实现同样的目的。

编辑:找出问题所在。导入upload.py时,将评估函数定义中的category = category_s。因此无论它设置的值如何,都不能在未来的category_s = ...修改时进行更改。有没有办法绕过这种行为?或者我想要?有没有更好的方法来实现我的目标?我想要一个简单的函数,我将99%的时间使用它,可以选择调用复杂的参数。问题是我还想定期更改简单函数中的默认参数。

2 个答案:

答案 0 :(得分:3)

在Python中,默认函数参数在定义函数时被评估为ONCE - 对category_smodel_s的进一步更改不会影响默认值。是的,这会带来各种各样的惊喜......

要实现可更改的默认值,请执行以下操作:

def upload(name, category = None, model = None):
    if category is None:
        category = category_s
    if model is None:
        model = model_s
    print(name, category, model)

如果None是参数的潜在实际值,您可能需要选择其他默认值。

答案 1 :(得分:0)

您可以将其移动到对象中并首先使用参数,然后回退到属性。

class Uploader:

def __init__(self, category="", model=""):
    self.category_s = category
    self.model_s = model

def setCategory(self, category):
    self.category_s = category

def setModel(self, model):
    self.model_s = model

def upload(self, name, category=None, model=None):
    print(name, category or self.category_s, model or self.model_s)

和其他代码

from uploader import Uploader

u = Uploader()
u.category_s = "cat1"
u.model_s = "mod1"
u.upload("name1")
u.upload("name2", "cat2", "mod2")

输出

('name1', 'cat1', 'mod1')
('name2', 'cat2', 'mod2')