2012-04-03 182 views
-1

我知道为什么这是一个坏主意,但这似乎是一个很好的例子,我想听听为什么我错了,以及我的替代品是什么。python:“从模块导入*”的情况?

我有充满核心逻辑的thing.py。

我有appthing.py,它希望使用该逻辑,同时为我们使用的环境添加一些特定于应用程序的事物,例如通过应用程序的内置持久存储功能保存关于所述逻辑的用户设置。 py会与之交互以恢复状态,等等。

我可以(在我看来):

  1. 重复thing.py在appthing.py函数名;这些调用原件
  2. 电话的事情,他们是:appthing.func1,appthing.thing.func2等
  3. 进口都在从进口的东西莫名其妙*
  4. 并行使用它们,并与appthing.funcs到处
  5. 工作

我不想做1 - 我讨厌重复的代码/工作。 2似乎是一个忍耐(appthing.settingA成为appthing.thing.settingA)。总的来说,3似乎是一个糟糕的主意。这留下了4,导入*,我知道这是错误的,但在这种情况下,它似乎没问题。

你说什么?我的选择5是什么?谢谢。

我应该注意,在任何地方都没有任何类。我试图打破所有地方上课的习惯。这些都不需要它,所以简单地在模块之间进行子类化。

+1

您可以提供一个简短的代码样例来代替文字说明吗? – 2012-04-03 08:43:05

+1

请阅读有关问题的常见问题部分不要问。这个问题征求意见,并没有正确的答案,所以它不被认为是这个网站的主题。 – agf 2012-04-03 08:57:27

+0

对不起,agf。我认为这是一个正确的答案,即处理这个特定问题的标准方法。这就是我所期望的选项5。 – 2012-04-03 09:20:17

回答

2

5)进口只有你知道你将使用

6)一路走与面向对象,使thingappthing类,函数,其中来自thing


appthing继承选择是你的,真的。你认为最好的是什么?尤其要考虑维护代码的必要性。如果thing需要更改某些功能,会发生什么情况?这怎么影响appthing的用户?

在你的情况,我可能会选择自己的选项5.这样,它的明确什么我继承和thing的变化不影响appthing可以在不使用我去appthing通过代码进行。

我不会去1号,因为这真的很麻烦。务实,并选择一个规模可以轻松维护的设计。

+0

谢谢,埃米尔。我绝对避免数字1. – 2012-04-03 09:26:32

1

,最好的办法是做:

from mymodule.thing import my_settings as settings 
#... 
# use the name settings everywhere in this client code 

这样,你只有一个地方,如果你mymodule界面的变化(DRY原则)来更新。

选项4(from mymodule import *)使您的客户端代码易于在未来mymodule中的任何更改,并且还引入了名称冲突的机会。如果您确信不会发生名称冲突,并且您不会经常更新您的“核心”模块,那么就没问题;请注意,客户端代码中存在直接依赖关系。

1

这是可以接受的地方,你有一个模块,只提供可以在导入模块中看到的东西,以及只有一个这样的模块。

例如,在我的Django的项目,我喜欢一切从models导入views,这在我所有的车型带来的,和其他类,如Django自己的User类为不合格的名字到视图代码。这很方便,因为view模块将始终连接到models模块。我不会为任何其他模块配对。

+0

谢谢,马辛。这里的困难在于appthing.py中只有很少的东西 - 它只是添加了一些东西,比如保存设置。我只是把它们放在thing.py中,但是在库级代码中有特定于应用程序的代码,我必须尝试/除非在周围,否则会变得非常混乱。我真的不想导入*。我只想在应用程序中添加一些额外的功能,添加到thing.py中。 thing.py是非常低级的东西。它从别的地方进口。 – 2012-04-03 09:29:08

+0

@GaryFixler听起来好像你已经考虑过这一点,并认为它不太可能会导致问题。去吧。你的选择是使用类似django conf系统的东西来将模块中的所有变量复制到对象中。 – Marcin 2012-04-03 09:32:27