- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我知道在 python 中使用 import *
是一种不好的形式,而且我不打算养成它的习惯。然而,我最近遇到了一些我不理解的奇怪行为,想知道是否有人可以向我解释一下。
假设我有三个 python 脚本。第一个 first_script.py
包含:
MESSAGE = 'this is from the first script'
def print_message():
print MESSAGE
if __name__ == '__main__':
print_message()
显然运行这个脚本会给我MESSAGE 的内容。我有第二个脚本,名为 second_script.py
,包括:
import first_script
first_script.MESSAGE = 'this is from the second script'
if __name__ == '__main__':
first_script.print_message()
这种行为(打印这是来自第二个脚本
)对我来说很有意义。我已导入 first_script.py
,但覆盖了其命名空间内的变量,因此当我调用 print_message()
时,我得到了该变量的新内容。
但是,我还有third_script.py
,包括:
from first_script import *
MESSAGE = 'this is from the third script'
if __name__ == '__main__':
print MESSAGE
print_message()
产生的第一行是可以理解的,但第二行对我来说没有意义。我的直觉是,因为我已经通过第一行中的 * 导入到我的主命名空间中,所以我有一个全局变量称为MESSAGES
。然后在第二行中我覆盖 MESSAGES
。那么为什么该函数(从第一个脚本导入)会产生 OLD 输出,特别是考虑到 Second_script.py 的输出。有什么想法吗?
最佳答案
import module
、from module import smth
和 from module import *
可以有不同的用例。
import tools
加载tools
模块并在本地命名空间(也称为tools
)中添加对其的引用。之后,您可以通过在工具引用前面添加 tools
来访问任何工具引用,例如 tools.var1
变体:
import tools as sloot
完全相同,但您使用别名来访问模块中的引用(例如:sloot.var1
)。它主要用于具有众所周知的别名的模块,例如 import numpy as np
。
from tools import foo
直接从当前命名空间的tools
模块导入一些符号。这意味着您只能使用指定的符号,而无需对其进行限定。一个很好的用例是,您可以从具有相同功能的不同模块导入符号。例如
try:
from mod1 import foo
except ImportError:
from mod2 import foo
...
foo() # actually calls foo from mod1 if available else foo from mod2
这通常用作可移植性技巧。
危险:
from tools import *
这是一个常见的习惯用法,但如果模块没有记录它,可能不会达到您的预期。事实上,它从模块导入所有公共(public)符号,默认情况下所有没有初始 _
的符号可能包含不需要的东西。此外,模块可以声明一个特殊变量__all__
,它被假定声明公共(public)接口(interface),在这种情况下,只有__all__
中包含的符号才会被导入。
示例:
mod.py
__all__ = ['foo', 'bar']
def baz(x):
return x * 2
def foo():
return baz('FOO')
def bar():
return baz('BAR')
您可以使用(假设 mod.py 可以访问)
from mod import *
print(foo()) # should print FOOFOO
# ERROR HERE
x = baz("test") # will choke with NameError: baz is not defined
同时
import mod
print(mod.baz("test")) # will display as expected testtest
因此,如果 tools
模块的文档声明它是安全的并列出了实际导入的符号,则应该仅使用 from tools import *
。
关于python - 使用 *(星号)导入与作为 python 中的命名空间导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26767300/
*args 和 **kwargs 是什么意思? def foo(x, y, *args): def bar(x, y, **kwargs): 最佳答案 *args 和 **kwargs 是一个常见的惯
*args 和 **kwargs 是什么意思? def foo(x, y, *args): def bar(x, y, **kwargs): 最佳答案 *args 和 **kwargs 是一个常见的惯
*args 和 **kwargs 是什么意思? def foo(x, y, *args):def bar(x, y, **kwargs): 最佳答案
在python文档中2.4.3. Formatted string literals ,似乎可以在 f 字符串的 {} 中写一个星号后跟一个表达式,但我找不到如何使用它。 那是什么以及如何使用它?它是
这些函数定义中的*args和**kwargs是什么意思? def foo(x, y, *args): pass def bar(x, y, **kwargs): pass 参见Wha
这些函数定义中的*args和**kwargs是什么意思? def foo(x, y, *args): pass def bar(x, y, **kwargs): pass 参见Wha
这个问题在这里已经有了答案: Delegated yield (yield star, yield *) in generator functions (3 个答案) 关闭 6 年前。 假设我创建了
我有时注意到使用 *偶尔搜索光标下的单词会有略微不同的行为(通常是当我在不同的计算机之间切换时)。问题是当我搜索前面有 * 的单词时(如 c++ 指针)。例如: MyPointer *foo; ...
This question already has answers here: Keyword only parameter (1个答案) Python documentation for os.re
这是我的数据: dput(dt) structure(c(15236000, 0, 0, 0, 0, 36722900, 45971100, 0, 0, 0, 0, 99067
所以我有一个看起来像这样但有 6k 行的数据框: AWC, LocationID 333, *Yukon 485, *Lewis Rich 76, *Kodiak 666, Kodiak 54, *R
我有一个简单的问题。我想列出我们可以使用关键字星号(或星号)* 的所有场景。 我只知道这些场景: Select * from Customers; Select Count(*) from Custo
瑞安·贝茨的Railscast about git ,他的 .gitignore 文件包含以下行: tmp/**/* 使用双星号后跟一个星号的目的是什么:**/*?简单地使用 tmp/* 而不是 tm
我想以这种方式选择带有 class="x"的元素的所有后代元素: .x * { color: red; } a b
这个问题在这里已经有了答案: What does ** (double star/asterisk) and * (star/asterisk) do for parameters? (25 个答案
最近我在 Programming Paradigms 上看到了这个视频和教授。使用星号、星形和符号等术语。 这就是他如何使用这些运算符的: int i = 37; float f = *(float*
我尝试在自定义按钮中居中对齐符号星号 (*),但我做不到。 如何像其他字符一样垂直居中对齐(1,2...)? 最佳答案 只需使用不同的字符。除了 * (ASTERISK U+002A),还有许多其他类
结论 概括的来说,就是对修饰的变量进行拆分, 对修饰的形式参数进行参数聚集。 单*号,将被修饰的变量按元素方式拆分, 对修饰的形式参数进行参数聚集。 双**号,将被修饰的变量按键值对进行拆分, 对
如果我想保持功能,并且不想在中间使用 *,那么等效的替代函数是什么?例如, import operator as op print(op.eq(*map(str.upper, ['a', 'A']))
我窥视 ng2-dropdown 我可以看到(ng2-dropdown-menu.ts) 除其他事项外 transition('hidden => visible', [
我是一名优秀的程序员,十分优秀!