在Python中允许多种类型参数是好习惯吗

2 投票
1 回答
676 浏览
提问于 2025-04-18 03:04

我正在做一个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来处理。

撰写回答