我正在尝试在循环内创建函数并将它们存储在字典中.问题是字典中的所有条目似乎最终都映射到最后创建的函数.代码如下:
functions = []
for i in range(3):
def f():
return i
# alternatively: f = lambda: i
functions.append(f)
Run Code Online (Sandbox Code Playgroud)
这输出:
print([f() for f in functions])
# expected output: [0, 1, 2]
# actual output: [2, 2, 2]
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?
我希望能够从导入的模块中动态检索当前执行的模块或类名.这是一些代码:
foo.py:
def f():
print __name__
Run Code Online (Sandbox Code Playgroud)
bar.py:
from foo import f
def b(): f()
Run Code Online (Sandbox Code Playgroud)
这显然不起作用__name__
,因为包含该功能的模块的名称.我希望在foo
模块内部访问的是当前正在使用的执行模块的名称foo
.因此,在上面的情况下,它将是bar
但如果导入任何其他模块foo
我想foo
动态地访问该模块的名称.
编辑:该inspect
模块看起来非常有前途,但它并不完全是我想要的.我希望的是我可以访问的某种全局或环境级变量,它包含当前执行模块的名称.并不是说我不愿意遍历堆栈来查找信息 - 我只是认为Python可能已经暴露了这些数据.
编辑:这是我试图使用它的方式.我有两个不同的Django应用程序,它们都需要将错误记录到文件中.让我们说它们被称为"AppOne"和"AppTwo".我还有一个地方可以记录这些文件:" /home/hare/app_logs
".在任何给定点的每个应用程序中,我希望能够导入我的记录器模块并调用将日志字符串写入文件的日志功能.但是,我想要做的是创建一个目录,app_logs
该目录是当前应用程序的名称("AppOne"或"AppTwo"),以便每个应用程序的日志文件将进入各自的日志记录目录.
为了做到这一点,我认为最好的办法是对记录器模块能够获得某种形式的全局变量,它表示当前应用程序的名称,因为它是负责了解父日志目录的位置,并创建应用程序的日志目录,如果它还不存在.
为什么:
from fabric.api import env, run
def update():
env.hosts = ['apycat']
run('cd /var/www/menu; svn up')
Run Code Online (Sandbox Code Playgroud)
在我的fab update
时候不起作用,同时:
from fabric.api import env, run
env.hosts = ['apycat']
def update():
run('cd /var/www/menu; svn up')
Run Code Online (Sandbox Code Playgroud)
呢?
在文档中没有找到任何相关内容.
当我跑这个fabfile.py
......
from fabric.api import env, run, local, cd
def setenv(foo):
env.hosts = ['myhost']
def mycmd(foo):
setenv(foo)
print(env.hosts)
run('ls')
Run Code Online (Sandbox Code Playgroud)
用这个命令fab mycmd:bar
.我得到了这个输出......
['myhost']
No hosts found. Please specify (single) host string for connection:
Run Code Online (Sandbox Code Playgroud)
什么什么?!我不明白吗?我设置了env.hosts
它似乎是有效的"内部" mycmd
功能,但由于某种原因,该run
命令不知道hosts
我已经指定.
让我困惑的颜色.任何帮助,将不胜感激!