我需要一种方法来检查类,所以我可以放心地识别哪些属性是用户定义的类属性.问题是,像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构建一个非常复杂的系统,当我调试时,我经常将简单的print语句放在几个脚本中.为了保持概述,我经常还要打印出print语句所在的文件名和行号.我当然可以手动执行,或者使用以下内容:
from inspect import currentframe, getframeinfo
print getframeinfo(currentframe()).filename + ':' + str(getframeinfo(currentframe()).lineno) + ' - ', 'what I actually want to print out here'
Run Code Online (Sandbox Code Playgroud)
它打印的东西像:
filenameX.py:273 - 我真的想在这里打印出来
为了使它更简单,我希望能够做到这样的事情:
print debuginfo(), 'what I actually want to print out here'
Run Code Online (Sandbox Code Playgroud)
所以我把它放到某个地方的函数中并试着这样做:
from debugutil import debuginfo
print debuginfo(), 'what I actually want to print out here'
print debuginfo(), 'and something else here'
Run Code Online (Sandbox Code Playgroud)
不幸的是,我得到:
debugutil.py:3 - what I actually want to print out here
debugutil.py:3 - and something else here
Run Code Online (Sandbox Code Playgroud)
它打印出我定义函数的文件名和行号,而不是我调用debuginfo()的行.这很明显,因为代码位于debugutil.py文件中.
所以我的问题实际上是:如何获取调用此debuginfo()函数的文件名和行号? …
在Eclipse下,我可以使用Ctrl+ Shift+ 检查调试模式下的表达式/变量I.在IntelliJ IDEA(Community Edition)中,我可以向表中添加表达式/变量,但在下一次调试时它们会丢失.
有什么方法可以在我调试时动态检查变量和表达式吗?
对于我的应用程序中的详细调试消息,我使用的函数返回一个有用的前缀.请考虑以下示例:
import inspect
def get_verbose_prefix():
"""Returns an informative prefix for verbose debug output messages"""
s = inspect.stack()
module_name = inspect.getmodulename(s[1][1])
func_name = s[1][3]
return '%s->%s' % (module_name, func_name)
def awesome_function_name():
print "%s: Doing some awesome stuff right here" % get_verbose_prefix()
if __name__ == '__main__':
awesome_function_name()
Run Code Online (Sandbox Code Playgroud)
这输出:
test->awesome_function_name: Doing some awesome stuff right here
我的问题是:当我在一个包中有一个模块时,例如'myproject.utilities.input',返回的模块名称get_verbose_prefix仍然只是'input',而不是'myproject.utilities.input'.当在不同子模块中可以有多个"输入"模块共同工作时,这大大降低了大型项目中前缀的帮助性.
所以我的问题是:是否有一种简单的方法可以在Python中的包中检索完整的模块名称?我打算扩展get_verbose_prefix功能,以检查模块的父目录"__init__.py"文件来推断它的全名,但首先我想知道是否有一个更简单的方法来做到这一点.
按照惯例,在进行自动化测试时,我在 Chrome 中使用“检查”(CTRL+SHIFT+I)通过 xpath、id、CSS 选择器等查找元素。例如:
//li/a[contains(text(), "Products")]
Run Code Online (Sandbox Code Playgroud)
以上是此页面的 xpath。在以前版本的 Chrome 中,按 CTRL+F 打开“查找”选项并粘贴此 xpath 元素后,在“开发工具”/“元素”中会在“开发工具”窗口中突出显示。在新版本的 chrome 中,它没有突出显示,通常的“1/1”结果显示在“查找”选项卡的最右侧。
我已经搜索了互联网和 Chrome 设置,但无济于事。黄色突出显示是节省时间的,我确信我使用的是正确的元素。
编辑:用 Chrome 版本 84.0.4147.105 修复
感谢您提供更新、建议、解决方法等。
我按照谷歌的说明操作:https://developer.chrome.com/devtools/docs/remote-debugging.我也经历了故障排除部分 - 但似乎没有任何效果.
我有三星galaxy 3(android 4.1.2,chrome 42.0.2311.111).USB调试已启用.我已经尝试重启USB设备几次后重启设备.
在Windows 8上我运行chrome(44.0.2388.0 canary).我安装了三星USB驱动程序,我的电脑可以看到我的设备.
插入设备时或使用检查页面打开金丝雀时,我都没有收到任何通知.我错过了什么吗?
我有一组工作页面,想要在JSP页面的断点处检查变量.遗憾的是,变量的上下文菜单没有像在Java文件中那样显示正常的Inspect/Watch选项.有任何想法吗?
我该如何调试/检查apk webview的元素.
我试过这个,但它只适用于chrome而不是apk.
请建议我
我正在编写一个装饰器,并且出于各种恼人的原因[0],检查它包装的函数是独立定义还是作为类的一部分定义(以及新类继承哪些类)是有利的. .
例如:
def my_decorator(f):
defined_in_class = ??
print "%r: %s" %(f, defined_in_class)
@my_decorator
def foo(): pass
class Bar(object):
@my_decorator
def bar(self): pass
Run Code Online (Sandbox Code Playgroud)
应打印:
<function foo …>: False
<function bar …>: True
Run Code Online (Sandbox Code Playgroud)
另外,请注意:
typeof或inspect)将不起作用.[0]:具体来说,我正在编写一个装饰器,可以很容易地进行参数化测试nose.然而,nose将不会运行的子类测试发生器unittest.TestCase,所以我想我的装饰器能够确定它是否正在使用的一个子类中,TestCase并且不能用一个适当的错误.显而易见的解决方案-利用isinstance(self, TestCase)调用包装的函数之前是不行的,因为包装的功能需要是一个发生器,它没有得到执行,在所有.