Python测试是否存在对象
我认为它是不好的风格来使用try:except:对于流控制,但我不知道如何编写下面的代码来测试Django中的DB字段是否存在。这是“脏”的代码工作:Python测试是否存在对象
@receiver(pre_save, sender=UserProfile)
def create_user_profile(sender, instance=None, **kwargs):
try:
print str(instance.bank_account)
except:
print 'No account'
我宁愿想这样做,但我得到当if
语句运行异常和对象不存在:
@receiver(pre_save, sender=UserProfile)
def create_user_profile(sender, instance=None, **kwargs):
if instance.bank_account is None:
print 'No account'
else:
print str(instance.bank_account)
我猜你遇到一个BankAccount.DoesNotExist
错误?如果是这种情况,您可以撤消UserProfile
和BankAccount
之间的关系。看看Django ticket #10227,看看这里发生了什么。这就是说,如果我需要处理你的代码,我宁愿看到明确的try...except
而不是解决方法,除非该解决方法实际上是有意义的。
该票证描述了我确切的问题。谢谢。我将使用try:除DoesNotExist: – j7nn7k 2012-03-13 11:27:02
我非常喜欢你的第一个例子,但也许你可以使用hasattr(instance,'bank_account')
作为安全措施?
首先,你的第一个例子是这样做的首选方式(尽管你可能希望缩小范围除了你期望的这个操作的例外)。
我想象你的if语句是吹起来的时候instance is None
;该解决方案是将测试添加到您的if语句,来测试instance
第一:
if instance and instance.bank_account:
print str(instance.bank_account)
else: print 'No account'
如果你不知道,如果字段存在,你可以用getattr(instance, 'bank_account', None)
,这既检索值,和交易替代instance.bank_account
该属性不存在的可能性。
为什么字段永远不存在? – 2012-03-13 10:52:32
第一次创建和保存 – j7nn7k 2012-03-13 10:54:21
出于好奇:您是遵循项目指南还是个人喜好?我会考虑你的不合格''除了坏风格,但如果你使用'AttributeError'除外。那么我更喜欢你的第一个例子。 – 2012-03-13 10:55:21