当您已经直接导入模块时,使用完整的模块方式是否有任何意义?

Is there any sense of using full way to module when you already imported module directly?

在此导入的情况下:

from app.settings import setting1

  1. settings.setting1
  2. setting1

是否存在需要在代码中使用选项 1 但选项 2 不起作用的情况?

from app.settings import setting1
settings.setting1  # error!

这不起作用,因为 settings 是一个没有任何限制的名称。在当前范围内,您只定义了setting1print(locals())可以确认您。

所以我假设你的意思是:

import app.settings as settings
from app.settings import setting1
# difference between :
setting1
# and :
settings.setting1 = 43

两者之间有细微的差别。
通过执行 from app.settings import setting1,您可以在名称 setting1app.settings 模块中的相应值之间的当前范围内创建绑定。该值被复制。无论这是对可变对象还是不可变对象的引用,都会改变您查看对其所做更改的方式。
一个例子:

# file: app/settings.py
setting1 = 80
# file: main.py
import app.settings as settings
from app.settings import setting1
print(f"after import, setting1: {setting1}")                      # 80

settings.setting1 = 43
print(f"after assign n°1, module setting1: {settings.setting1}")  # 43
print(f"after assign n°1, local setting1: {setting1}")            # 80

setting1 = -11
print(f"after assign n°2, module setting1: {settings.setting1}")  # 43
print(f"after assign n°2, local setting1: {setting1}")            # -11

导入 复制了 80 并将其绑定到当前范围内的 setting1 名称,而另一个值 80 存在在模块中。它们是不同的(因为不可变),因此更改一个不会影响另一个。

但是如果我使用可变对象(例如列表),这就是我得到的:

# file: app/settings.py
setting1 = [80]
# file: main.py
import app.settings as settings
from app.settings import setting1
print(f"after import, setting1: {setting1}")                      # [80]

settings.setting1.append(43)
print(f"after append n°1, module setting1: {settings.setting1}")  # [80, 43]
print(f"after append n°1, local setting1: {setting1}")            # [80, 43]

setting1.append(-11)
print(f"after append n°2, module setting1: {settings.setting1}")  # [80, 43, -11]
print(f"after append n°2, local setting1: {setting1}")            # [80, 43, -11]

在这里,使用本地绑定或来自模块的引用没有任何改变,它们都只是对同一个可变对象的引用。

我曾经有过这样的问题:我导入了定义在模块顶层的变量来共享数据,但是当导入是 from my.module import my_shared_variable 时(静默地)创建了一个副本,并且数据是实际上没有共享。所以我不得不使用第一个选项,因为第二个选项不是我想要的。

除了这个 mutable/immutable 陷阱之外,如果您没有对导入做一些棘手的事情,那么两者是等价的。