我有以下代码
fset = [ obj for name,obj in inspect.getmembers(sys.modules[__name__]) if inspect.isfunction(obj) ]
def func(num):
pass
if __name__ == "__main__":
print(fset)
打印
[]
然而这
def func(num):
pass
fset = [ obj for name,obj in inspect.getmembers(sys.modules[__name__]) if inspect.isfunction(obj) ]
if __name__ == "__main__":
print(fset)
打印
[<function func at 0x7f35c29383b0>]
那么 fset 如何成为当前模块中所有函数的列表,其中 fset 定义在所有函数的顶部?
编辑 1:我想做的是
def testall(arg):
return any(f(arg) for f in testfunctions)
def test1(arg):
#code here
# may call testall but wont call anyother test*
def test2(arg):
#code here
# may call testall but wont call anyother test*
以后可能会增加更多的测试功能。这就是 fset/testfunctions 的原因
最佳答案
EDIT 1: What I am trying to do is
def testall(arg):
return any(f(arg) for f in testfunctions)
def test1(arg):
#code here
# may call testall but wont call anyother test*
这很好用:
def testall(arg):
testfunctions = [obj for name,obj in inspect.getmembers(sys.modules[__name__])
if (inspect.isfunction(obj) and
name.startwith('test') and name != 'testall')]
return any(f(arg) for f in testfunctions)
def test1(arg):
#code here
# may call testall but wont call anyother test*
在这种情况下,testfunctions 在 testall 被调用之前不会被评估,所以这里没有问题——到那时,所有顶级模块代码(包括test1 definition) 将被评估,因此 testfunctions 将获得所有顶级函数。 (我在这里假设 testall 或 test1 是从模块底部的 if __name__ == '__main__' block 调用的,或者另一个脚本正在执行 import tests; tests.test1(10),或者类似的东西。)
事实上,即使你明确命名了test1和test2,也不会有问题:
def testall(arg):
testfunctions = ('test1',)
return any(f(arg) for f in testfunctions)
def test1(arg):
#code here
# may call testall but wont call anyother test*
同样,test1 已在您调用 testall 时定义,因此一切正常。
如果您想了解其工作原理,则必须了解此处的各个阶段。
当您导入模块或运行顶层脚本时,第一个阶段是编译(除非已经有缓存的 .pyc 文件)。编译器不需要知道一个名字有什么值(value),只需要知道它是本地的还是全局的(或闭包单元),它已经可以告诉 sys 和 inspect和 test1 是全局变量(因为您没有在 testall 或封闭范围内分配给它们)。
接下来,解释器按顺序执行顶层模块的编译字节码。这包括执行函数定义。所以,testall 变成了一个函数,然后 test1 变成了一个函数,然后 test2 变成了一个函数。 (函数实际上只是适当的编译代码,附加了一些额外的东西,比如定义它的全局命名空间。)
稍后,当您调用testall 函数时,解释器会执行该函数。这是列表理解(在第一个版本中)或全局名称查找(在第二个版本中)发生的时候。由于 test1 和 test2 的函数定义已经被评估并绑定(bind)到模块中的全局名称,所以一切正常。
如果您稍后调用 test1,而后者调用 testall,会怎样?没问题。解释器执行test1,其中有对testall的调用,显然已经定义好了,所以解释器调用那个,其余同上一段。
那么,如果您在 test1 和 test2 定义之间调用 testall 或 test1 会怎么样?在那种情况下,test2 还没有被定义,因此它不会出现在列表中(第一个版本),或者会引发一个 NameError(第二个版本)。但只要你不那样做,就没有问题。并且没有充分的理由这样做。
如果您担心每次调用 testall 时计算 testfunctions 的可怕性能成本……好吧,首先,这是一个愚蠢的担心;你要调用多少次?您的函数真的快到调用和过滤 getmembers 的时间甚至出现在雷达上吗?但如果真的很担心,只需将值缓存在您最喜欢的常用方式中——可变默认值、私有(private)全局函数、函数属性……:
def testall(arg, _functions_cache=[]):
if not _functions_cache:
_functions_cache.extend([…])
关于python - 获取当前模块中所有函数的列表。检查当前模块不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18907712/
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)