<p>1)您需要斜杠,因为Django通常(但不总是)遵循pep8,其中的行最多应该有80个字符。不过,更好的方法是:</p>
^{1}$
<p>通常应避免<code>\</code>。在</p>
<p>2)本规范没有任何不雅之处。只需创建查找所需的属性。为什么你觉得它不优雅?你希望这个怎么写?在</p>
<p>需要再短于3)行。可以使用<code>()</code>重写并缩短:</p>
^{pr2}$
<p>然而,由于Django使用python2.4(我认为他们很快或已经在升级版本),所以他们不能使用inline <code>if-else</code>。在</p>
<p>另一方面,也可以用更短的方式写:</p>
<pre><code>def has_output(self):
if isinstance(self.field, models.related.RelatedObject) \
and self.field.field.null or hasattr(self.field, 'rel') \
and self.field.null:
return len(self.lookup_choices) > 0
else:
return len(self.lookup_choices) > 1
</code></pre>
<p>但是我觉得原来的方法通过使用<code>extra</code>变量稍微清晰了一点。这里你需要一个注释,为什么它是0或1。有了额外的你不需要评论,它是非常清楚的。我不喜欢评论,所以我更喜欢第一种方式:-)</p>
<p>4)这看起来确实很混乱。我认为最好把它分成三个更小的方法,每个方法都有可能产生一些结果。但是我不确定python2.4(或python2.5)是否允许从子例程中产生(我有一些模糊的记忆,这是后来甚至在py3中引入的)。不管怎样,我会把这些字典的创建放在一个单独的方法中,因为它看起来很不寻常。我更喜欢这样:</p>
<pre><code>def choices(self, cl):
from django.contrib.admin.views.main import EMPTY_CHANGELIST_VALUE
yield self._some_default_choice()
for pk_val, val in self.lookup_choices:
yield self._choice_from_lookup_choices(pk_val, val)
if isinstance(self.field, models.related.RelatedObject) \
and self.field.field.null or hasattr(self.field, 'rel') \
and self.field.null:
yield self._some_conditional_choice()
</code></pre>
<p>当然,我会为子方法使用一些更有意义的名称,但我看不到完整的上下文,也不知道这些选择是什么。在</p>
<p><strong>最后:</strong></p>
<p>你在这里看到的是Python被推到了极限。Django是一个大框架。有一些特性是Django是一个大型项目的结果,现在已经开发了几年,人们学习新东西。幸运的是,Django开发人员正在慢慢地删除他们认为是错误的东西,例如,更改django1.4中的默认项目结构,弃用这些内容,并碰撞python版本。实际上,从阅读django代码和提问中可以学到很多东西。你也许可以通过尝试重构一些代码,然后学习,为什么它不那么容易,为什么它必须保持原样;-)尝试一下,它会很有趣的:-)</p>