- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
问题的一些背景知识。我正在用 Python2.7 编写代码,运行良好。但出于可用性和维护目的,我决定将其分成模块,这对我来说是新的,因此遇到了一些问题。虽然我已经能够通过点击和试用方法使其发挥作用,但不确定这是否是正确的方法,因此在这里分享。这里共享的代码是驱动相同逻辑、顺序和方法的真实代码的简化复制。
MainEx.py是最高层运行的脚本
from LogIn_1 import LogIn
global NumTry
NumTry = 2
LogIn()
# xx is here just to show NumTry variable is further used in MainEx script
xx = NumTry*3
基本上,我在这里试图传达的是 NumTry 变量在 MainEx.py (最高级别的脚本)以及 LogIn() 函数中使用。并且也将被我正在创建的其他函数使用。
LogIn_1.py是用户定义的函数
def LogIn():
from MainEx import NumTry
# following are some computations involving NumTry
print NumTry
运行 MainEx.py 给出结果:
2
2
问题:1. 不知道为什么它会生成两次结果2. 这看起来很奇怪,MainEx 导入 LogIn_1,LogIn_1 导入 MainEx。类似于相互导入变量的乒乓球情况。
我能够通过以下更改获得正确的结果:MainEx.py
from LogIn_1 import LogIn
global NumTry
NumTry = 2
#LogIn()
# xx is here just to show NumTry variable is further used in MainEx script
xx = NumTry*3
LogIn_1.py
def LogIn():
from MainEx import NumTry
# following are some computations involving NumTry
print NumTry
LogIn()
运行 MainEx.py 给出结果:
2
我正在尝试了解避免 future 出现问题的最佳实践。
最佳答案
如果您在代码中添加一堆打印语句,您可以遵循详细信息:
# MainEx.py
print 'MainEx: start'
from LogIn_1 import LogIn
print 'MainEx: after Login import'
global NumTry
NumTry = 2
print 'MainEx: before Login() call'
LogIn()
print 'MainEx: after Login() call'
xx = NumTry*3
print 'MainEx: finish'
# LogIn_1.py
print 'start LogIn_1'
def LogIn():
print ' Login(): start'
from MainEx import NumTry
print ' Login(): after MainEx import'
print NumTry
print ' Login(): finish'
print 'finish LogIn_1'
输出:
MainEx: start
start LogIn_1
finish LogIn_1
MainEx: after Login import
MainEx: before Login() call
Login(): start
MainEx: start # Code in MainEx running again!
MainEx: after Login import
MainEx: before Login() call
Login(): start
Login(): after MainEx import
2
Login(): finish
MainEx: after Login() call
MainEx: finish
Login(): after MainEx import
2
Login(): finish
MainEx: after Login() call
MainEx: finish
如您所见,将 (a) 循环导入与 (b) 具有顶级副作用的代码相结合会导致相反的结果。特别是,当 from MainEx import NumTry
在 Login()
调用中运行时,Python 似乎必须重新执行 MainEx
中的代码,因为该模块还没有 NumTry
属性,导致重复打印。我并没有真正期待这个结果......但它就是这样。
最佳实践建议:
将导入语句放在模块的顶部,而不是放在函数或类内。
设计您的代码以避免循环导入。您的程序模块最终具有某种层次结构:您的低级模块不会从您自己的代码库中导入任何内容;并且您的较高级别模块导入您的较低级别模块。
设计您的模块,确保其顶层不会发生。模块应该只定义类、定义函数、分配常量或导入较低级别的模块。只有系统的主模块应该执行某些操作 - 并且该操作应该是调用您的顶级函数(传递任何命令行参数),甚至该调用也应该是有条件的,如下所示:
import sys
def main(args):
...
def foo():
...
def bar():
...
if __name__ == '__main__':
main(sys.argv[1:])
关于python - 在Python2.7中如何使用主脚本和其他用户定义函数中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41627681/
我听说过两种数据库架构。 大师级 主从 master-master不是更适合现在的web吗,因为它就像Git一样,每个单元都有整套数据,如果一个宕机也无所谓。 主从让我想起了 SVN(我不喜欢它),你
我们当前将 MySQL 配置为支持故障转移:Site1 Site2。当它们被设置为主/主时。在给定时间点,应用程序服务器仅主动写入一个站点。我们想要设置一个新的故障转移站点。然后我们将拥有 Site
我听说过两种数据库架构。 大师-大师 主从 master-master 不是更适合当今的网络吗,因为它就像 Git,每个单元都有整套数据,如果其中一个发生故障,也没关系。 主从让我想起 SVN(我不喜
我正在创建一个标记为类别的表,其中主类别(父列)包含 0,子类别包含父类别的 ID。我听说这叫引用。我的问题:这张表的结构正确吗?或者是否有更好的方法,例如实现遍历树或类似方法? CREATE TAB
我正在阅读一份关于 C++ 与 C 的文档。该文档说与 C 相比,C++ 编写得非常紧凑。一个例子是,C 允许 main() 函数类型为 void。另一方面,C++ 不允许这样做,他给出了标准中的以下
C main函数和Java main函数有什么区别? int main( int argc, const char* argv[] ) 对比 public static void main(Strin
我一直摸不着头脑,但运气不好。设计器有一个包含 3 栏的站点、两个侧边栏和一个主要内容区域。 专为桌面设计,左栏、主要内容、右栏。但是,在较小的设备上,我们希望首先堆叠主要内容。 所以通常情况下,你可
我一直在阅读有关 Jenkins 主/从配置的信息,但我仍然有一些问题: 是不是真的没有像 Jenkins 主站那样安装和启动从站 Jenkins?我假设我会以相同的方式安装一个主 Jenkins 和
据我了解,Viemodel中MVVM背后的概念包括业务逻辑和/或诸如暴露于 View 的数据的主/明细关系之类的事物 因此,正如我发现的那样,有很多ORM生成器,例如模型的telerik a.o以及另
我们有一个群集,其中包含3个主分区,每个主分区有2个副本。主/副本分片的总文档数相同;但是,对于同一查询/文档,我们得到3个不同的分数。当我们将preference = primary添加为查询参数时
我有一个非常大/旧/长时间运行的项目,它使用相对于启动目录的路径访问文件资源(即应用程序仅在从特定目录启动时才工作)。当我需要调试程序时,我可以从 eclipse 启动它并使用“运行配置”->->“工
谁能向我解释一下为什么我在这段代码上遇到段错误?我一直试图弄清楚这一点,但在各种搜索中却一无所获。当我运行代码而不调用 main(argc, argv) 时,它会运行。 Slave 仅将 argv 中
使用 xcode 中的默认项目作为主从应用程序,如果我在折叠委托(delegate)中放置 print 调试语句,当我旋转设备时它似乎永远不会被触发(事实上我永远无法触发它)。 我编辑的代码位于 Ap
是否有任何产品可以使 mysql 主/从故障转移过程更容易?一些可以自动发生的事情,而不是手动修复它。 最佳答案 [...稍后...;) 你所说的“更容易”是什么?MySQL 有很多解决方案: MyS
我有两个 mysql 数据库。我想做主/主复制。 复制以一种方式进行。然而,反过来说却不然。该错误表明它无法与用户“test@IPADDRESS”连接。 如何将用户名更改为 repl?从未进行过测试,
我正在尝试在 MySQL 中运行以下查询: GRANT REPLICATION SLAVE ON *.* TO 'replication'@’10.141.2.%’ IDENTIFIED BY ‘sl
我正在尝试使用 Android 提供的主/详细流程模板创建一个应用程序,并且我正在尝试将多个操作栏菜单项添加到操作栏的主要部分和详细信息部分。这就是我要实现的目标: (来源:softwarecrew.
我正在寻找一个跨平台的 C++ master/worker 库或工作队列库。一般的想法是我的应用程序将创建某种任务或工作对象,将它们传递给工作主机或工作队列,这将依次在单独的线程或进程中执行工作。为了
我似乎看到很多人在他们的 MySQL 模式中任意分配大尺寸的主/外键字段,例如 INT(11) 甚至 WordPress 使用的 BIGINT(20)。 如果我错了,请纠正我,但即使是 INT(4)
如果我有一个可以与多个键相关联的用户,正确的表设置应该是: 一个表有两列,例如: UserName | Key 没有主键且用户可以有多行,或者: 具有匹配标识符的两个表 Table 1 Us
我是一名优秀的程序员,十分优秀!