标签: metaprogramming

SQLAlchemy中的动态类创建

我们需要创建SQLAlchemy类来访问多个外部数据源,这些数据源的数量会随着时间的推移而增加.我们为我们的核心ORM模型使用声明性基础,我知道我们可以使用autoload = True手动指定新的ORM类来自动生成映射.

问题是我们需要能够动态生成它们,如下所示:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

stored={}
stored['tablename']='my_internal_table_name'
stored['objectname']='MyObject'
Run Code Online (Sandbox Code Playgroud)

并动态地将它变成这样的东西:

class MyObject(Base):
    __tablename__ = 'my_internal_table_name'
    __table_args__ = {'autoload':True}
Run Code Online (Sandbox Code Playgroud)

我们不希望类持续时间超过打开连接,执行查询,然后关闭连接所需的时间.因此,理想情况下,我们可以将上面"存储"变量中的项目放入数据库中,并根据需要提取它们.另一个挑战是对象名称(例如"MyObject")可能在不同的连接上使用,所以我们不能定义它一次并保持它.

关于如何实现这一点的任何建议将不胜感激.

谢谢...

python sqlalchemy metaprogramming metaclass declarative

21
推荐指数
1
解决办法
5702
查看次数

在Python中分配实例的__class__属性

在什么情况下可能,什么时候不可能,__class__在Python中分配实例的属性?

错误消息,例如TypeError: __class__ assignment: only for heap types不要真的为我做.

python metaprogramming

21
推荐指数
1
解决办法
3988
查看次数

Ruby String与正则表达式分开

这是Ruby 1.8.7但应该与1.9.x相同

我试图拆分一个字符串,例如:

a = "foo.bar.size.split('.').last"
# trying to split into ["foo", "bar","split('.')","last"]
Run Code Online (Sandbox Code Playgroud)

基本上在它代表的命令中拆分它,我试图用Regexp做但不确定如何,想法是使用regexp

a.split(/[a-z\(\)](\.)[a-z\(\)]/)
Run Code Online (Sandbox Code Playgroud)

在这里尝试使用组(\.)来分割它,但这似乎不是一个好方法.

ruby regex metaprogramming

21
推荐指数
2
解决办法
3万
查看次数

是否有类似于继承的类#的钩子只在Ruby类定义之后触发?

#inheritedclass Foo声明之后立即调用.我想要一些只在end关闭类声明的语句之后运行的东西.

这里有一些代码来举例说明我的需求:

class Class
  def inherited m
    puts "In #inherited for #{m}"
  end
end

class Foo
  puts "In Foo"
end
puts "I really wanted to have #inherited tiggered here."


### Output:
# In #inherited for Foo
# In Foo
# I really wanted to have #inherited tiggered here.
Run Code Online (Sandbox Code Playgroud)

这样的事情存在吗?可以创建吗?我完全没有运气吗?

ruby inheritance metaprogramming class

20
推荐指数
4
解决办法
6223
查看次数

是否可以替换现有对象的groovy方法?

以下代码尝试替换Groovy类中的现有方法:

class A {
  void abc()  {
     println "original"
  }
} 

x= new A()
x.abc()
A.metaClass.abc={-> println "new" }
x.abc()
A.metaClass.methods.findAll{it.name=="abc"}.each { println "Method $it"}

new A().abc()
Run Code Online (Sandbox Code Playgroud)

它会产生以下输出:

original
original
Method org.codehaus.groovy.runtime.metaclass.ClosureMetaMethod@103074e[name: abc params: [] returns: class java.lang.Object owner: class A]
Method public void A.abc()
new
Run Code Online (Sandbox Code Playgroud)

这是否意味着当通过将元类设置为闭包来修改元类时,它并不真正替换它,而只是添加它可以调用的另一个方法,从而导致元类有两个方法?是否有可能真正替换方法,以便第二行输出打印"新"?

在试图找出它时,我发现DelegatingMetaClass可能有所帮助 - 这是最Groovy的方法吗?

groovy metaprogramming

20
推荐指数
2
解决办法
8802
查看次数

我如何使用class_eval?

我不明白class_eval.

class Module
  def attr_ (*syms)
    syms.each do |sym|
      class_eval %{def #{sym}= (val)
        @#{sym} = val
      end}
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

什么%意思?

怎么class_eval办?

哪里(val)来了?

ruby metaprogramming

20
推荐指数
1
解决办法
1万
查看次数

对于不了解Lisp的人,是否有任何Template Haskell教程?

我想学习模板Haskell,但我找到的所有教程要么假设你学习了lisp并且知道什么是lisp宏,或者你知道一些cs理论行话 - 作为拼接,quasiquotations等等 - 或者关于宏的一些理论结果.

我不能编写一行lisp代码(虽然我打算有一天这样做,但我现在没时间学习它).Haskell是我的第一个函数式语言,我学到了它,我可以定期编写代码,使用monad,applicative,理解类型系统等等......但我不太了解(也想学习但是我对它来说太愚蠢......:P)关于它背后的理论背景.所以我对通常在TH教程中找到的术语一无所知.

因此,问题是:对于编写Haskell的人,有没有关于TH的教程,而不是作为一名专业的计算机科学家,而是作为一个使用编程进行日常琐事的人,他将Haskell作为他的第一个函数语言学习?也许介绍一下以TH为例的宏和元编程?

谢谢大家.:)

macros haskell metaprogramming template-haskell

20
推荐指数
2
解决办法
2068
查看次数

如何设置"动态"变量值?

我正在使用Ruby on Rails 3.0.9,我试图"动态"设置一些变量值.那是...

...在我的模型文件中我有:

attr_accessor :variable1, :variable2, :variable3


# The 'attributes' argument contains one or more symbols which name is equal to 
# one or more of the 'attr_accessor' symbols.

def set_variables(*attributes)

  # Here I should set to 'true' all ":variable<N>" attributes passed as symbol
  # in the 'attributes' array, but variable names should be interpolated in a 
  # string.
  # 
  # For example, I should set something like "prefix_#{':variable1'.to_s}_suffix".

end
Run Code Online (Sandbox Code Playgroud)

如何将这些变量值设置为true


我尝试使用该self.send(...)方法,但我没有成功(但是,可能,我不知道如何使用该send方法...是否可以通过使用该 …

ruby variables metaprogramming ruby-on-rails ruby-on-rails-3

20
推荐指数
2
解决办法
2万
查看次数

元编程是反射的一个子集吗?

我曾经认为元编程涉及修改程序,并且(对于什么是反射及其为什么有用?)的一些答案,反思仅仅包括对程序的内省.但是,反射标签维基说

反射是程序在运行时可以观察和 修改自身结构和行为的过程.

反思是程序可以执行内省的过程.这种内省通常涉及在运行时观察和修改自身结构和行为的能力.从理论角度来看,反思涉及程序指令作为数据存储的事实.程序代码和数据之间的区别在于如何处理信息.因此,程序可以将自己的代码视为数据并观察或修改它们.

[强调补充]

元编程的描述是

元编程正在编写编写或操纵其他程序作为其数据的程序.

元编程很有用,因为它可以节省程序员宝贵的时间.有些语言支持元编程本身,这允许创建具有强大表现力的代码.

(我认为"写"并不意味着将源代码写入文件,因为这是代码生成.)

这会使元编程只是反射的一个子集吗?

或者这些术语是不同的,因为某些编程语言是由另一种语言元编程的,在这种情况下,元编程会发生而不是反射?(在维基百科元编程文章中有一个未被引用的句子声称这个)

或者"反射"和"元编程"这两个术语的使用方式会有所不同,具体取决于该人使用的编程语言?

reflection terminology metaprogramming

20
推荐指数
1
解决办法
3149
查看次数

转换运算符模板专业化

这是理解转换运算符,模板和模板特化的主要学术练习.在下面的代码转换操作符模板工程int,float以及double,但使用时失败std::string...之类的.我已经创建了转换为的特化std::string,它在初始化时使用std::string s = a;,但在与强制转换一起使用时失败static_cast<std::string>(a).

#include <iostream>
#include <string>
#include <sstream>

class MyClass {
     int y;
public:
    MyClass(int v) : y(v) {}
    template <typename T>
    operator T() { return y; };
};

template<>
MyClass::operator std::string() {
    std::stringstream ss;
    ss << y << " bottles of beer.";
    return ss.str();
}

int main () {
    MyClass a(99);
    int i    = a;
    float f  = a;
    double d = a; …
Run Code Online (Sandbox Code Playgroud)

c++ templates metaprogramming template-specialization

20
推荐指数
1
解决办法
6705
查看次数