我在python中寻找工具或示例来/如何验证字典.
例如,我有dict:
test = {'foo' : 'bar', 'nested' : {'foo1' : 'bar1', 'foo2' : 'bar2'} }
Run Code Online (Sandbox Code Playgroud)
现在我必须验证它.可以说,key的值foo必须是boolean False或非空字符串.接下来,如果key foo1具有值bar1,则该键foo2 必须在范围内为int 1..10.我写了简单的函数来做到这一点,但这不是我想要的.是的,当然,我可以测试dict中的每一个项目if..else,但如果dict有> 50个元素,那么它有点不舒服.
在Python中有没有好的工具/库?我不是在寻找解析器,只是快速有效地做到这一点.
我的项目中有这些文件:
- main.py
- module1.py
- module2.py
Run Code Online (Sandbox Code Playgroud)
main 是将在控制台中直接执行的主文件.
module1将被导入main和抛出Module1Exception.
module2将被导入module1,抛出Module2Exception
并使用抛出NormalException和CriticalException异常的库.
在所有异常应用程序应退出.
哪个选项是捕获这些错误的最有效方法?
a)所有异常都将被捕获main,打印消息和退出
b)允许模块捕获异常(module2捕获lib异常,module1仅捕获Module2Exception和main捕获Module1Exception),打印消息并退出.
c)与b一样,除了模块不会退出,而是返回False并调用exitmain
编辑:
这将是服务器端应用程序,作为守护进程运行.我希望将来我会使用多个具有全局日志监控功能的服务器,如水槽或抄写员.必须抓住例外情况.这些文件只是示例.事实上,我正在编写一个大型应用程序,它充当一种服务器.在这一刻我写了加载和解析配置文件的模块.在这种情况下,如果引发任何异常,脚本应该退出.只有在这种情况下.加载配置文件并通过测试后,脚本将无人值守.
我正在寻找从子线程获取父ID或名称的方法.在示例中,我将主线程作为MainThread.在这个线程中,我创建了一些新线程.然后我threading.enumerate()用来获取对所有正在运行的线程的引用,选择一个子线程并以某种方式获取MainThread的ID或名称.有办法做到这一点吗?
我有这个多维词典:
a = {'a' : 'b', 'c' : {'d' : 'e'}}
Run Code Online (Sandbox Code Playgroud)
并编写简单的函数来压扁该字典:
def __flatten(self, dictionary, level = []):
tmp_dict = {}
for key, val in dictionary.items():
if type(val) == dict:
tmp_dict.update(self.__flatten(val, level + [key]))
else:
tmp_dict['.'.join(level + [key])] = val
return tmp_dict
Run Code Online (Sandbox Code Playgroud)
用dict调用这个函数后a我得到了结果:
{'a' : 'b', 'c.d' : 'e'}
Run Code Online (Sandbox Code Playgroud)
现在,在对这个扁平的字典做出一些指示之后,我需要从扁平的字母中构建新的,多维的字典.例:
>> unflatten({'a' : 0, 'c.d' : 1))
{'a' : 0, 'c' : {'d' : 1}}
Run Code Online (Sandbox Code Playgroud)
我唯一的问题是我没有功能unflatten:)
任何人都可以帮忙吗?我不知道该怎么做.
编辑:
另一个例子:
{'a' : 'b', 'c.d.e.f.g.h.i.j.k.l.m.n.o.p.r.s.t.u.w' : 'z'}
Run Code Online (Sandbox Code Playgroud)
应该是unflatten之后: …
我对 ANTLR 中的 @members 规则有疑问。我想覆盖默认的错误处理,所以我阅读了http://www.antlr.org/wiki/display/ANTLR3/Error+reporting+and+recovery并为我的语法编写了这个简单的代码:
@members {
def displayRecognitionError(self, tokenNames, e):
print 'Test'
}
Run Code Online (Sandbox Code Playgroud)
我的语法中没有 @lexer::members 或 @parser::members 。此规则中的代码(python 运行时)仅包含在解析器文件中,而不包含在词法分析器中。这是一个错误?我认为是的,@members 应该根据文档向词法分析器和解析器添加内容。我使用 Python 运行时 3.1.3。
顺便提一句。stackoverflow 内联代码是否适用于 Opera?
我为它定义了根记录器和处理程序:
_root = logging.getLogger()
_sh = logging.StreamHandler()
_fh = logging.FileHandler('./error.log', delay = True)
_root.addHandler(_sh)
_root.addHandler(_fh)
Run Code Online (Sandbox Code Playgroud)
和模块记录器实例:
_log = logging.getLogger("Main")
# In other file
_log = logging.getLogger("Configuration")
Run Code Online (Sandbox Code Playgroud)
现在我调用_log.exceptiontry..except 块:
_log.exception("Test")
Run Code Online (Sandbox Code Playgroud)
现在我在控制台和文件中得到回溯。我尝试使用控制台处理程序禁止打印 exc_info,但不使用文件处理程序:
class _TraceBackFilter(logging.Filter):
def filter(self, rec):
rec.exc_info = None
return True
_sh = logging.StreamHandler()
_sh.addFilter(_TraceBackFilter())
_root.addHandler(_sh)
Run Code Online (Sandbox Code Playgroud)
这适用于文件和控制台处理程序,所有处理程序都完全删除了回溯,但我只需要控制台。有什么方法可以只为控制台处理程序而不是文件处理程序抑制 exc_info 吗?
编辑:
我修改_TraceBackFilter类。
class _TraceBackFilter(logging.Filter):
def filter(self, rec):
if rec.exc_info:
logging.getLogger(rec.name).log(rec.levelno, rec.getMessage())
return False
else:
return True
Run Code Online (Sandbox Code Playgroud)
现在它适用于控制台处理程序,但在文件中我将消息加倍,一个有一个没有回溯。