在Python中允许多种类型参数是好习惯吗
我正在做一个django项目。在我写的一个函数中,我使用了一个myModel
的实例。我在考虑是直接把这个实例传给函数,还是传这个实例的私钥,然后通过查询来获取这个实例:
def myFunction(IdOrObj):
myObj = myModel.objects.get(pk=IdOrObj) if isinstance(IdOrObj, int) else IdOrObj
...
这样做算不算坏习惯?如果算的话,原因是什么,还有什么其他的选择呢?
1 个回答
2
我发现这种做法会让代码变得相当难看。一旦你在多个地方都这样做,你的很多函数就会变成这个样子:
def myFunction(StrangeMetaObject):
if isinstance(StrangeMetaObject, int):
# Do the
elif isinstance(StrangeMetaObject, str):
# Do the str thing...
elif isinstance(StrangeMetaObject, MyObject):
# ...
还有一种情况是,调用代码想传入一些看起来相似的东西,但它们并没有共享任何继承关系。例如,这种情况应该是允许的:
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
class Fox(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
def print_age(IdOrObj):
# This will fail if passed a Fox
myObj = Person.objects.get(pk=IdOrObj) if isinstance(IdOrObj, int) else IdOrObj
print('%s is %s years old' % (myObj.name, myObj.age))
对于你的使用场景,我建议你始终使用Django模型来传递数据,几乎没有必要只用ID来处理。