是否有一种 Pythonic 方法可以将函数参数键入特定的 Django 模型对象?
Is there a Pythonic way to type a function parameter to a specific django model object?
假设我有这样一个模型:
class Foo():
name = models.CharField()
还有一个像这样的函数:
def update_foo_name(foo_object):
foo_object.name = "New Name"
有没有办法在 update_foo_name()
上强制键入,以便此处只能传递 Foo
的有效对象?
比如 update_foo_name(foo_object: Foo.objects)
.
如果有人问过这个问题,我们深表歉意,在此先感谢您的回复!
pythonic 方式应该是
class Foo():
name = models.CharField()
def change_name(self, new_name: str):
self.name = new_name
self.save()
如果你真的想在 Foo 范围之外,在全局函数中或从 Bar class 中执行它,例如,保证的方法是:
class Bar()
...
def method_to_change_foo_name_for_any_reason(self, foo: Foo):
assert isinstance(foo, Foo), TypeError("Not a Foo object")
foo.name = "New name that bar gives to foo"
foo.save()
Python不做静态类型检查,see details here.
意思就是这个:
def set_foo_name(foo: Foo):
foo.name="New Name"
当您传入其他类型的对象时,不会引发异常。
您必须 运行 assert isinstance(foo, Foo)
按照 Luid 的回答。
假设我有这样一个模型:
class Foo():
name = models.CharField()
还有一个像这样的函数:
def update_foo_name(foo_object):
foo_object.name = "New Name"
有没有办法在 update_foo_name()
上强制键入,以便此处只能传递 Foo
的有效对象?
比如 update_foo_name(foo_object: Foo.objects)
.
如果有人问过这个问题,我们深表歉意,在此先感谢您的回复!
pythonic 方式应该是
class Foo():
name = models.CharField()
def change_name(self, new_name: str):
self.name = new_name
self.save()
如果你真的想在 Foo 范围之外,在全局函数中或从 Bar class 中执行它,例如,保证的方法是:
class Bar()
...
def method_to_change_foo_name_for_any_reason(self, foo: Foo):
assert isinstance(foo, Foo), TypeError("Not a Foo object")
foo.name = "New name that bar gives to foo"
foo.save()
Python不做静态类型检查,see details here.
意思就是这个:
def set_foo_name(foo: Foo):
foo.name="New Name"
当您传入其他类型的对象时,不会引发异常。
您必须 运行 assert isinstance(foo, Foo)
按照 Luid 的回答。