我是红宝石的新手,我正在玩IRB.
我发现我可以使用".methods"方法列出对象的方法,而self.methods类似于我想要的东西(类似于Python的dir(builtins)?),但我怎样才能找到方法库/模块我通过include和require加载?
irb(main):036:0* self.methods
=> ["irb_pop_binding", "inspect", "taguri", "irb_chws", "clone", "irb_pushws", "public_methods", "taguri=", "irb_pwws",
"public", "display", "irb_require", "irb_exit", "instance_variable_defined?", "irb_cb", "equal?", "freeze", "irb_context
", "irb_pop_workspace", "irb_cwb", "irb_jobs", "irb_bindings", "methods", "irb_current_working_workspace", "respond_to?"
, "irb_popb", "irb_cws", "fg", "pushws", "conf", "dup", "cwws", "instance_variables", "source", "cb", "kill", "help", "_
_id__", "method", "eql?", "irb_pwb", "id", "bindings", "send", "singleton_methods", "popb", "irb_kill", "chws", "taint",
"irb_push_binding", "instance_variable_get", "frozen?", "irb_source", "pwws", "private", "instance_of?", "__send__", "i
rb_workspaces", "to_a", "irb_quit", "to_yaml_style", "irb_popws", "irb_change_workspace", "jobs", "type", "install_alias
_method", "irb_push_workspace", "require_gem", …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何获取方法上所有装饰器的名称.我已经可以获取方法名称和docstring,但无法弄清楚如何获取装饰器列表.
我需要一种方法来检查类,所以我可以放心地识别哪些属性是用户定义的类属性.问题是,像DIR功能(),inspect.getmembers()和朋友返回所有类的属性包括预定义的像:__class__,__doc__,__dict__,__hash__.这当然是可以理解的,而且人们可以说,我只能命名的成员名单忽视,但遗憾的是这些预先定义的属性绑定,因此不同版本的Python使我的项目volnerable在Python项目改改 - 我不喜欢那样.
例:
>>> class A:
... a=10
... b=20
... def __init__(self):
... self.c=30
>>> dir(A)
['__doc__', '__init__', '__module__', 'a', 'b']
>>> get_user_attributes(A)
['a','b']
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我想要一种安全的方法来只检索用户定义的类属性['a','b']而不是'c',因为它是一个实例属性.所以我的问题是......任何人都可以帮我解决上述虚构功能get_user_attributes(cls)吗?
PS我花了一些时间试图通过解析AST级别的类来解决问题,这很容易.但我找不到将已解析的对象转换为AST节点树的方法.我想一旦将一个类编译成字节码,就会丢弃所有的AST信息.
最好的问候雅各布
如何在Python中获取包含当前正在执行的函数的变量?我不想要这个功能的名字.我知道我可以使用inspect.stack获取当前的函数名称.我想要实际的可调用对象.这可以在不使用inspect.stack检索函数的名称然后eval输入名称来获取可调用对象的情况下完成吗?
编辑:我有理由这样做,但它甚至不是一个好的.我正在使用plac来解析命令行参数.你可以通过do来使用它plac.call(main),它从"main"的函数签名生成一个ArgumentParser对象.在"main"中,如果参数有问题,我想退出一个包含ArgumentParser对象的帮助文本的错误消息,这意味着我需要通过调用直接访问该对象plac.parser_from(main).print_help().能够说出来是很好的:plac.parser_from(get_current_function()).print_help()所以我不依赖于被命名为"main"的函数.现在,我的"get_current_function"实现将是:
import inspect
def get_current_function():
return eval(inspect.stack()[1][3])
Run Code Online (Sandbox Code Playgroud)
但是这个实现依赖于具有名称的函数,我认为这不是太繁重.我永远不会这样做plac.call(lambda ...).
从长远来看,要求plac的作者实现print_help方法来打印最近使用plac或类似东西调用的函数的帮助文本可能更有用.
列出所有定义方法的最短,单行方式是attr_accessor什么?我想这样做,如果我有一个类MyBaseClass,任何扩展它的东西,我可以attr_accessor在子类中定义.像这样的东西:
class MyBaseClass < Hash
def attributes
# ??
end
end
class SubClass < MyBaseClass
attr_accessor :id, :title, :body
end
puts SubClass.new.attributes.inspect #=> [id, title, body]
Run Code Online (Sandbox Code Playgroud)
如何显示attr_reader和attr_writer定义?
一位同事今天问我一个有趣的问题 - C#关键字/运算符"是否被认为是反思?
object tmp = "a string";
if(tmp is String)
{
}
Run Code Online (Sandbox Code Playgroud)
这个操作符是如何在幕后实现的?它需要反思还是内省?或者由于语言的强类型性质,对象的类型是否可以作为内存中对象的顶级属性立即访问?
MSDN声明:
请注意,is运算符仅考虑引用转换,装箱转换和拆箱转换.is运算符不考虑其他转换,例如用户定义的转换.
考虑盒装和非盒装转换的能力似乎意味着某种内省.
有没有办法在Python中获取对象的名称?例如:
my_list = [x, y, z] # x, y, z have been previously defined
for bla in my_list:
print "handling object ", name(bla) # <--- what would go instead of `name`?
# do something to bla
Run Code Online (Sandbox Code Playgroud)
编辑:一些上下文:
我实际上在做的是创建一个我可以通过命令行指定的函数列表.
我有:
def fun1:
pass
def fun2
pass
def fun3:
pass
fun_dict = {'fun1': fun1,
'fun2': fun2,
'fun3': fun3}
Run Code Online (Sandbox Code Playgroud)
我从命令行获取函数的名称,我想调用相关函数:
func_name = parse_commandline()
fun_dict[func_name]()
Run Code Online (Sandbox Code Playgroud)
我想拥有该函数名称的原因是因为我想创建fun_dict两次函数的名称,因为这似乎是创建错误的好方法.我想做的是:
fun_list = [fun1, fun2, fun3] # and I'll add more as the need arises
fun_dict …Run Code Online (Sandbox Code Playgroud) 我知道如何使用以下代码打印"所有"全局变量
for k,v in pairs(_G) do
print("Global key", k, "value", v)
end
Run Code Online (Sandbox Code Playgroud)
所以我的问题是如何为当前正在执行的函数可访问的所有变量执行此操作,这可以locals()为Python 做什么.
这主要是好奇心,我不确定这是什么实际用途,但这里有.
由于块也是Objective-C对象,是否可以检查它们的类型?也就是说,它是否响应isKindOfClass:消息以及如何对块使用该消息?
我的天真认为它可能是这样的:
-(void) aMethod {
typedef int (^BlockA)(int x, int y);
id blockVar = ...; // get a block from somewhere
if([blockVar isKindOfClass:BlockA]) {
BlockA blockVarA = blockVar;
int result = blockVarA(1,2);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码可能不起作用.但是,如果它是可以检查块的类型,什么是做了正确的方法是什么?
如果我有一个UIViewController子类,我怎么能把类名作为字符串?我试过了[vc class],但这会返回一个Class对象,而不是一个NSString.
introspection ×10
python ×4
objective-c ×2
ruby ×2
.net ×1
attributes ×1
c# ×1
class ×1
closures ×1
cocoa-touch ×1
decorator ×1
function ×1
inspect ×1
ios ×1
irb ×1
lua ×1
oop ×1
reflection ×1
typing ×1