我正在使用Python的logging机制将输出打印到屏幕上.我可以使用print语句执行此操作,但我希望允许用户更精细地调整粒度以禁用某些类型的输出.我喜欢为错误打印的格式,但是当输出级别为"info"时,我更喜欢更简单的格式.
例如:
logger.error("Running cmd failed")
logger.info("Running cmd passed")
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我希望以不同的方式打印错误的格式:
Run Code Online (Sandbox Code Playgroud)# error Aug 27, 2009 - ERROR: Running cmd failed # info Running cmd passed
是否可以为不同的日志级别设置不同的格式而无需多个日志记录对象?我宁愿在没有修改记录器的情况下这样做,因为有大量的if/else语句来确定如何记录输出.
我的组织一直在尝试引入更多"敏捷"方法.我们一直在尝试Scrum方法,大多数团队或多或少都适应了它.我喜欢它作为一个整体,但我担心该方法的一个潜在的严重影响:由于团队一直专注于功能和积压项目,并且测试人员与整个开发过程更加整合,似乎技能组合正在变得模糊不清,人们对自己的个人能力缺乏尊重.
我们的一些开发人员在服务器端技术和优化重量级数据配置方面表现出色.其他人已经投入了大量的职业学习GUI技术,并在应用程序中对用户和可用性有了基本的了解.技能组合都不比另一组技术好,但它们肯定是不同的.
这是Scrum流程的必然结果吗?由于团队中的每个人(据我所知)都有助于满足下一个功能/要求,积压项目或测试目标,因此基本理念似乎是"任何人都可以做到".根据我的经验,这根本不是真的.大多数工程师(开发人员,测试人员等)都拥有他们多年来磨练的特定技能,而在我看来,Scrum方法往往会贬低他们之前所尊重的那些能力.
这是一个澄清的例子:
如果服务器端数据配置发生突然的技术更改,并且sprint的待办事项列表中的每个项目都基于这一新变化,那么GUI开发人员(可能没有时间适应新技术)可能无法为冲刺做出贡献.至少,他们需要投入时间来加强,然后他们的代码将因为缺乏经验而受到怀疑.
我理解快速发展的必要性,以阻止"角色孤岛",但这并没有打折一个基本现实:人们根据必要性,兴趣或经验发展技能.当人们认为他们的位置是"插件能力"之一时,他们似乎没有那么积极性(例如,我们可以"插入"任何人来执行这项特定任务).Scrum如何解决这个问题?如果没有,有人在采用Scrum方法时解决了这个问题吗?
我最近做了一些工作修改使用wxPython小部件的Python gui应用程序.我已经在过去的六七年中尝试过Python,但这是我第一次使用gui进行任何工作.我对使用Python的gui编程的当前状态感到非常失望.我非常喜欢Python语言本身,这是我习惯的Delphi/ObjectPascal编程的一个有趣变化,对于通用编程任务来说肯定是一个很大的生产力提升.我想转向Python以获取一切.
但是wxPython是Delphi的VCL或.NET的WinForms之后的一大步.虽然Python本身通过编程更高级别的抽象提供了良好的生产力增益,但wxPython的使用方式比VCL更低的抽象级别.例如,我浪费了很多时间试图让wxPython列表对象按照我想要的方式运行.只是添加可排序的列涉及几个代码密集的步骤,一个用于创建和维护提供实际排序顺序的阴影数据结构,另一个用于在列标题中显示图形排序方向三角形,以及还有一些我不记得了.所有这些容易出错的步骤都可以通过使用我的Delphi网格组件设置属性值来完成.
我的结论是:虽然Python通过提高许多通用编码的抽象级别来提高生产率,但wxPython的几个抽象级别比Delphi的gui工具要低.最终结果:使用Delphi进行gui编程比使用Python进行gui编程要快得多,而得到的带有Delphi的ui仍然更加精致和功能齐全.对我来说,似乎并不夸张地认为Delphi gui编程在1995年比使用wxPython的python gui编程更加先进.
我做了一些其他python gui框架的调查,看起来没有任何比wxPython好得多.我也对wxPython的gui formbuilders进行了一些简单的调查,这会让事情变得更好一些.但是大多数报道这些解决方案都是错误的,甚至一个伟大的formbuilder都无法解决我对wxPython的主要抱怨,这只是因为它具有较少的功能,并且通常要求你以比我低得多的抽象级别进行gui编程.以前用于Delphi的VCL.一些快速调查建议的python gui-dev解决方案(http://wiki.python.org/moin/GuiProgramming)对于习惯使用Delphi或.NET的人来说实在有些令人沮丧.
最后,我有几个问题.
首先,我错过了什么吗?是否有一些Python的gui开发解决方案可以与VCL或WinForms编程进行比较?我不一定关心它是否与Delphi的VCL不相符.我只是在找同一个联盟的东西.
第二,IronPython可以成为前进的方向吗?我大多试图避免喝.NET koolaid,但也许IronPython让我有理由最终放弃.即便如此,IronPython是否与WinForms完全集成,或者我需要让表单本身由c#或vb支持.净?在我看来,SharpDevelop和MonoDevelop就是这种情况(即,IronPython不能用于设计时间的gui构建).VS.NET是否将IronPython与gui-building完全集成?
在我看来,像Python一样可以"接管世界"的方式类似于Visual Basic在1990年代早期的方式,如果有一些精彩的新gui构建解决方案出现在Python中.只有这次使用Python,我们才能拥有全新的快速,跨平台和开源 gui编程范例 .企业不会吃掉它吗?是的,我知道,网络应用程序是当今最重要的事情,所以一个伟大的Python-gui解决方案不会创造VB曾经做过的同样的革命.但是我没有看到gui编程消失,我想要一个很好的现代,开源,高级解决方案.
我有一个整数列表,我需要解析为一系列范围.
例如:
[0, 1, 2, 3] -> "0-3"
[0, 1, 2, 4, 8] -> "0-2,4,8"
Run Code Online (Sandbox Code Playgroud)
等等.
我还在学习更多pythonic处理列表的方法,这对我来说有点困难.我最近的想法是创建一个列表,跟踪配对数字:
[ [0, 3], [4, 4], [5, 9], [20, 20] ]
Run Code Online (Sandbox Code Playgroud)
然后,我可以遍历此结构,将每个子列表打印为范围或单个值.
我不喜欢在两次迭代中这样做,但我似乎无法跟踪每次迭代中的每个数字.我的想法是做这样的事情:
这是我最近的尝试.它有效,但我并不完全满意; 我一直在想,有一个更优雅的解决方案完全逃脱了我.字符串处理迭代不是最好的,我知道 - 对我来说这是很早的:)
def createRangeString(zones):
rangeIdx = 0
ranges = [[zones[0], zones[0]]]
for zone in list(zones):
if ranges[rangeIdx][1] in (zone, zone-1):
ranges[rangeIdx][1] = zone
else:
ranges.append([zone, zone])
rangeIdx += 1
rangeStr = ""
for range in ranges:
if range[0] != range[1]:
rangeStr = "%s,%d-%d" % (rangeStr, range[0], range[1])
else:
rangeStr …Run Code Online (Sandbox Code Playgroud) 我正在为我正在组合的应用程序进行基本用户身份验证,而且我没有太多安全经验.
这就是说,我理解在数据库中将(盐渍)密码哈希作为blob进行盐析/存储的做法(和必要性),而不是密码(加密或否).我已经实现了这一点.
通过对用户名进行腌制/散列并将散列存储在数据库中,而不是明文(或加密)中的用户名,是否可以获得任何东西?令我感到震惊的是,这将使得确定哪些用户可以使用数据库进行身份验证来访问系统变得更加困难.
由于让某人难以破解用户帐户的密码至关重要,因此增加确定哪些用户可行的难度也不合理吗?
编辑:我可能使用的某些语言不是100%正确:随意纠正:-)
编辑2:我改变了我的第一个点,表示腌制哈希 - 感谢大家指出我错过了这个:-)
Edit3:删除了表示我正在加密/解密密码的措辞.我正在使用盐渍哈希并将其存储在数据库中 - 感谢Scotty指出这一点.
我正在尝试使用Python的csv模块(特别是DictReader类)解析CSV文件.是否有Pythonic方法来检测空或丢失的字段并抛出错误?
这是一个使用以下标题的示例文件:NAME,LABEL,VALUE
foo,bar,baz
yes,no
x,y,z
Run Code Online (Sandbox Code Playgroud)
在解析时,我希望第二行抛出错误,因为它缺少VALUE字段.
这是一段代码片段,展示了我是如何接近这一点的(忽略硬编码字符串......它们只是为了简洁而存在):
import csv
HEADERS = ["name", "label", "value" ]
fileH = open('configFile')
reader = csv.DictReader(fileH, HEADERS)
for row in reader:
if row["name"] is None or row["name"] == "":
# raise Error
if row["label"] is None or row["label"] == "":
# raise Error
...
fileH.close()
Run Code Online (Sandbox Code Playgroud)
是否有更清晰的方法来检查CSV文件中的字段是否有一堆if语句?如果我需要添加更多字段,我还需要更多条件,如果可能的话我想避免这些条件.
我正在使用QTableWidgetPyQt4中的组件,根据各自的标头长度,我似乎无法正确地确定列的大小.
这是表布局应该是什么样的(显然没有管道):
Index | Long_Header | Longer_Header
1 | 102402 | 100
2 | 123123 | 2
3 | 454689 | 18
Run Code Online (Sandbox Code Playgroud)
我正在使用的代码看起来像这样:
import sys
from PyQt4.QtCore import QStringList, QString
from PyQt4.QtGui import QApplication, QMainWindow, QSizePolicy
from PyQt4.QtGui import QTableWidget, QTableWidgetItem
def createTable():
table = QTableWidget(5, 3)
table.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
headers = QStringList()
headers.append(QString("Index"))
headers.append(QString("Long_Header"))
headers.append(QString("Longer_Header"))
table.setHorizontalHeaderLabels(headers)
table.horizontalHeader().setStretchLastSection(True)
# ignore crappy names -- this is just an example :)
cell1 = QTableWidgetItem(QString("1"))
cell2 = QTableWidgetItem(QString("102402"))
cell3 = QTableWidgetItem(QString("100"))
cell4 …Run Code Online (Sandbox Code Playgroud) 我最近采访了一家公司,该公司已开始为其开发周期引入Scrum.我向其中一位开发人员询问了他们的体验是什么,听起来他们完全脱离了规划过程.他不允许任何关于什么进入特定Sprint的输入,也没有参与任何计划或修饰活动.
基本上,在最后一个Sprint(或两个)开始时,他被交给了待办事项清单.他不得不将项目分解为各自的任务(因此他们可以在Sprint上工作),但没有参与任何计划活动; 我怀疑他被允许对项目可能花费多少努力的大量投入 - 我怀疑建筑师为团队决定了这一点.
这是Scrum应该如何处理?我现在的团队完全参与所有计划活动,不断添加我们对如何解决功能以及可能采取多少措施的意见.我对一家公司有点持怀疑态度(并且很紧张),该公司只是简单地将开发人员列入待办事项清单而不要求他们提供意见.
注意:据我所知,一旦Sprint启动,列表确实是一个优先的待办事项列表.我担心的是从一开始就没有投入到规划过程中.
这个代码,
for (byte b = 0; b < 100; b++)
{
//some code
}
Run Code Online (Sandbox Code Playgroud)
比这段代码跑得快?
for (int b = 0; b < 100; b++)
{
//some code
}
Run Code Online (Sandbox Code Playgroud) 我需要的动作脚本
Loading configuration file /opt/flex/frameworks/flex-config.xml
t3.mxml(10): Error: unsupported sampling rate (24000Hz)
[Embed(source="music.mp3")]
t3.mxml(10): Error: Unable to transcode music.mp3.
[Embed(source="music.mp3")]
Run Code Online (Sandbox Code Playgroud)
代码是
<?xml version="1.0"?>
<!-- embed/EmbedSound.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import flash.media.*;
[Embed(source="sample.mp3")]
[Bindable]
public var sndCls:Class;
public var snd:Sound = new sndCls() as Sound;
public var sndChannel:SoundChannel;
public function playSound():void {
sndChannel=snd.play();
}
public function stopSound():void {
sndChannel.stop();
}
]]>
</mx:Script>
<mx:HBox>
<mx:Button label="play" click="playSound();"/>
<mx:Button label="stop" click="stopSound();"/>
</mx:HBox>
</mx:Application>
Run Code Online (Sandbox Code Playgroud) 我需要一个从Apache日志文件中提取URL的逻辑:现在我这样做了:
apache_log = {'@source': 'file://xxxxxxxxxxxxxxx//var/log/apache2/access.log', '@source_host': 'xxxxxxxxxxxxxxxxxxx', '@message': 'xxxxxxxxxxxxxxx xxxxxxxxxx - - [02/Aug/2013:12:38:37 +0000] "POST /user/12345/product/2 HTTP/1.1" 404 513 "-" "PycURL/7.26.0"', '@tags': [], '@fields': {}, '@timestamp': '2013-08-02T12:38:38.181000Z', '@source_path': '//var/log/apache2/access.log', '@type': 'Apache-access'}
data = apache_log['@message'].split()
if data.index('"POST') and data[data.index('"POST')+2].startswith('HTTP'):
print data[data.index('"POST')+1]
Run Code Online (Sandbox Code Playgroud)
它回报我:
/user/12345/product/2
Run Code Online (Sandbox Code Playgroud)
基本上结果是正确的,但我这样做的方式我并不喜欢.
有人可以建议更好(更Pythonic)从apache日志文件中提取此路径的方法.
我正在尝试从基本程序创建一个 jar。
我有以下 build.gradle
apply plugin: 'groovy'
version = '1.0'
repositories {
mavenCentral();
}
dependencies
{
compile files (fileTree(dir: 'lib', include: ['*.jar']),
fileTree(dir: 'lib/DocxDep', include: ['*.jar']))
}
task buildLabServicesJar(type: Jar) {
from files(sourceSets.main.output.classesDir)
from {
configurations.compile.collect {
it.isDirectory() ? it : zipTree(it)
}
configurations.runtime.collect {
it.isDirectory() ? it : zipTree(it)
}
}
manifest {
attributes 'Implementation-Title': 'Lab Services',
'Implementation-Version': version,
'Main-Class': 'org.xxx.clarity.ClarityServices'
}
}
Run Code Online (Sandbox Code Playgroud)问题是当我运行和/或检查 jar 文件时,我的 src/** sclasses 不包括在内!(所有依赖都是完美的)
这里有什么问题?
更新
当我添加: from files(fileTree(dir: …
我正在做很多变量,但我想通过while语句来做这个.
问题是我无法弄清楚如何将变量用作变量名的一部分,以便在循环id中创建的变量不会多次创建(从而导致错误).
我有一个像这样的循环:
int index = 0
while (index < 10){
JLabel A1 = new JLabel("A" + [index]);
index++;
}
Run Code Online (Sandbox Code Playgroud)
显然我不希望我的所有变量都被称为A1,因为这不是合法的语法.我如何拥有它以使我的变量为A [index]?