Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python';define_方法的s等价性_Python_Ruby - Fatal编程技术网

Python';define_方法的s等价性

Python';define_方法的s等价性,python,ruby,Python,Ruby,我在ruby中有以下代码: class Package def initialize(name) @name = name @elements = [] end [:type, :block].each do |bindtype| define_method "get_#{bindtype}_by_name" do |name| get_by_name(name, bindtype) end end def get_by_name(name,

我在ruby中有以下代码:

class Package

def initialize(name)
    @name = name
    @elements = []
end

[:type, :block].each do |bindtype|
    define_method "get_#{bindtype}_by_name" do |name|
        get_by_name(name, bindtype)
    end
end

def get_by_name(name, bindtype=nil)
    @elements.each do |element|
        return if element.name == name
    end
    return nil
end
我读过这个问题,我想用我的Ruby代码在Python中实现同样的东西:

bindtypes = {"type", "block"}

class Package:

    def __init__(self, name):
        self.name = name
        self.elements = list()

    def get_by_name(self, name, bindtype=None):
        for element in self.elements:
            if element.name == name:
                return element
        return None

for bindtype in bindtypes:
    def _in_bindtype(self, bindtype, bindtype):
        Package.get_by_name(bindtype, bindtype)
    setattr(Package, "get_"+bindtype+"_by_name", _in_bindtype
我这样调用函数:

package = Package("package")    
block = Block("blockName")
package.elements.append(block)
blockFound = package.get_block_by_name(block.name, block.bindtype)

但显然,这不起作用,因为我无法恢复正在搜索的元素的名称。有人能帮我更好地理解这个python define_方法是如何与我的代码一起工作的吗?

你几乎做到了;将
bindtype
值绑定为函数参数的默认值,并在
self
上调用
get\u by\u name()

for bindtype in bindtypes:
    def _in_bindtype(self, name, bindtype=bindtype):
        self.get_by_name(name, bindtype)
    setattr(Package, "get_{}_by_name".format(bindtype), _in_bindtype)
我冒昧地使用了
str.format()
来格式化方法名,而不是使用
+
串联,我发现它更具可读性

或者,在Python 3中,您可以创建:


不要使用
list()
创建空的列表对象,而是使用
[]
。谢谢你的时间!我想我没有很好地解释我的问题。我这样调用我的函数,例如
get\u block\u by\u name(“BlockName”,“block”)
,所以我的参数不同。我到处写
bindtype
,因为我不知道必须检索名称“BlockName”。你知道怎么取回这个名字吗?@user3314570:是的,恐怕你解释得不好。也许你可以用一个例子来更新你的问题,说明你期望事情如何运作?给我们输入和预期输出。但是考虑到你写的Ruby代码和你链接到的问题,我的回答完全涵盖了你的问题。我发现了我的问题。我只是需要替换bindtype(self,bindtype,bindtype=bindtype)中的
def:
self.get\u by\u name(bindtype,bindtype)
替换为
def\u in\u bindtype(self,name,bindtype=bindtype):
self.get\u by\u by\u name(name,bindtype)
。你的回答帮助我理解了它是如何工作的。谢谢啊,是的,我应该发现的。我还清理了
partialmethod
案例,因为我在其中留下了一个复制粘贴错误。
from functools import partialmethod

for bindtype in bindtypes:
    setattr(Package, "get_{}_by_name".format(bindtype),
            partialmethod(Package.get_by_name, bindtype=bindtype))