我有两个我想要使用的功能:复杂版本和简单版本。
复杂: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%的时间使用它,可以选择调用复杂的参数。问题是我还想定期更改简单函数中的默认参数。
答案 0 :(得分:3)
在Python中,默认函数参数在定义函数时被评估为ONCE - 对category_s
和model_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')