在python中允许多种类型的参数是一种好习惯

时间:2014-04-17 02:01:16

标签: python django

我正在研究一个django项目。在我编写的使用myModel实例的函数中,我考虑允许直接将该实例传递给函数或传递该实例的私钥并进行查询以检索实例:

def myFunction(IdOrObj):
    myObj = myModel.objects.get(pk=IdOrObj) if isinstance(IdOrObj, int) else IdOrObj
    ...

这是不好的做法吗?如果是这样,原因是什么,有什么替代方案?

1 个答案:

答案 0 :(得分:1)

我发现这种方法往往会使代码变得相当丑陋。一旦你开始在多个地方这样做,你的许多功能将如下所示:

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。