我使用Twitter引导工具提示与javascript如下:
$('a[rel=tooltip]').tooltip();
Run Code Online (Sandbox Code Playgroud)
我的标记看起来像这样:
<a rel="tooltip" title="Not implemented" class="btn"><i class="icon-file"></i></a>
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我<a>动态添加元素,工具提示没有显示那些动态元素.我知道这是因为我只在文档加载了典型的jquery $(document).ready(function()功能时绑定.tooltip()一次.
如何将其绑定到动态创建的元素?通常我会通过jquery live()方法执行此操作.但是,我用来绑定的事件是什么?我只是不确定如何使用jquery .live()连接bootstrap .tooltip().
我发现有一种方法可以使这项工作是这样的:
/* Add new 'rows' when plus sign is clicked */
$("a.add").live('click', function () {
var clicked_li = $(this).parent('li');
var clone = clicked_li.clone();
clone.find(':input').each(function() {
$(this).val('');
});
clicked_li.after(clone);
$('a[rel=tooltip]').tooltip();
});
Run Code Online (Sandbox Code Playgroud)
这有效,但看起来有点hackish.我也在$(ready)调用中调用完全相同的.tooltip()行.那么,当页面首次加载并匹配该选择器时,存在的元素是否会以两次工具提示结束?
我认为这种方法没有任何问题.我只是在寻找最佳实践或理解行为.
我有一个场景,用户想要将几个过滤器应用于Pandas DataFrame或Series对象.本质上,我想有效地将一堆过滤(比较操作)链接在一起,这些过滤由用户在运行时指定.
过滤器应该是添加剂(也就是应用的每个应该是狭窄的结果).
我目前正在使用,reindex()但每次创建一个新对象并复制基础数据(如果我正确理解文档).因此,在过滤大型系列或DataFrame时,这可能非常低效.
我认为使用apply(),map()或类似的东西可能会更好.我对Pandas很陌生,尽管如此仍然试图将我的头脑包裹起来.
我想获取以下表单的字典,并将每个操作应用于给定的Series对象并返回"已过滤"的Series对象.
relops = {'>=': [1], '<=': [1]}
Run Code Online (Sandbox Code Playgroud)
我将从一个当前的例子开始,只是过滤一个Series对象.以下是我目前使用的功能:
def apply_relops(series, relops):
"""
Pass dictionary of relational operators to perform on given series object
"""
for op, vals in relops.iteritems():
op_func = ops[op]
for val in vals:
filtered = op_func(series, val)
series = series.reindex(series[filtered])
return series
Run Code Online (Sandbox Code Playgroud)
用户提供包含他们想要执行的操作的字典:
>>> df = pandas.DataFrame({'col1': [0, 1, 2], 'col2': [10, 11, 12]})
>>> print df
>>> print df
col1 col2
0 …Run Code Online (Sandbox Code Playgroud) 我试图用pandas read_csv方法读取一个简单的空格分隔文件.但是,大熊猫似乎并没有遵守我的dtype观点.也许我错误地指定了它?
read_csv对于这个简单的测试用例,我已经提炼了一些复杂的调用.我实际上converters在我的"真实"场景中使用了这个参数,但为了简单起见我删除了它.
以下是我的ipython会话:
>>> cat test.out
a b
0.76398 0.81394
0.32136 0.91063
>>> import pandas
>>> import numpy
>>> x = pandas.read_csv('test.out', dtype={'a': numpy.float32}, delim_whitespace=True)
>>> x
a b
0 0.76398 0.81394
1 0.32136 0.91063
>>> x.a.dtype
dtype('float64')
Run Code Online (Sandbox Code Playgroud)
我也尝试过这种使用这种具有dtype的numpy.int32或numpy.int64.这些选择导致异常:
AttributeError: 'NoneType' object has no attribute 'dtype'
Run Code Online (Sandbox Code Playgroud)
我假设AttributeError是因为pandas不会自动尝试将浮点值转换/截断为整数?
我正在使用32位版本的Python运行32位机器.
>>> !uname -a
Linux ubuntu 3.0.0-13-generic #22-Ubuntu SMP Wed Nov 2 13:25:36 UTC 2011 i686 i686 i386 …Run Code Online (Sandbox Code Playgroud) 将numpy.float64打印并转换为字符串的正确/可接受方式是什么?我注意到只是使用print或str()将失去一些精度.但是,repr保持完整的精度.例如:
>>> import numpy
>>> print numpy.float64('6374.345407799015')
6374.3454078
>>> print repr(numpy.float64('6374.345407799015'))
6374.3454077990154
Run Code Online (Sandbox Code Playgroud)
我假设只是调用print转而调用str()float64对象.那么__str__()numpy.float64 是用类似的东西实现的,'%s' % (float(self))还是以某种方式用Python内置的方式强制转换float64 float()?我试图快速浏览一下numpy来源,但并不是很明显发生了什么.
我一直认为repr()应该返回可用于eval()重新创建对象的有效Python代码.这是一个公认的惯例吗?幸运的是,在这种情况下,numpy不遵循这个约定,因为repr()只返回原始数字作为字符串而不是类似的东西"numpy.float64('6374.345407799015')".
所以,所有这些让我感到困惑.将numpy.float64转换为字符串和/或打印它的正确方法是什么,同时保证您始终具有相同的完全精度?
我有一个布局,我添加了很多自定义小部件layout.addWidget(widget).后来我想删除所有这些自定义小部件并添加新的小部件.当涉及到deleteLater和时,我对最好的方法感到困惑setParent(None).例如,这是我的清理函数,它被调用布局中的所有小部件:
def _removeFilterWidgetFromLayout(self, widget):
"""Remove filter widget"""
self._collection_layout.removeWidget(widget)
widget.setParent(None)
widget.deleteLater()
Run Code Online (Sandbox Code Playgroud)
我怀疑并不是所有这些行都需要正确清理小部件使用的内存.我不确定C++和Python引用到底发生了什么widget.
以下是我对PyQt中对QObjects的C++和Python引用的理解.
我相信当您将小部件添加到布局时,小部件将成为布局的子级.因此,如果我调用removeWidget那么父关系就会被破坏,所以我必须自己清理C++和Python引用,因为小部件没有其他父级.调用setParent是一种删除与布局的父关系的明确方法.调用deleteLater是为了处理C++引用.
Python引用是垃圾收集的,因为widget变量超出范围,并且没有其他Python对象指向widget.
我需要打电话setParent和deleteLater或将deleteLater足以适当打扫一下吗?
作为旁注,我发现setParent(None)在这种情况下调用是一个非常昂贵的函数调用.通过删除此调用,我可以大大加快整个清理过程.我不确定是否deleteLater足以正确清理一切.这是我的分析输出line_profiler:
Line # Hits Time Per Hit % Time Line Contents
==============================================================
2167 @profile
2168 def _removeFilterWidgetFromLayout(self, widget):
2169 """Remove filter widget"""
2170
2171 233 1528 6.6 1.0 self._collection_layout.removeWidget(widget)
2172 233 143998 618.0 97.9 widget.setParent(None) …Run Code Online (Sandbox Code Playgroud) 我正在阅读ascii和二进制文件,它们都以fortran顺序指定3维数组.我想对这些数组执行一些任意操作,然后将它们导出为相同的ascii或二进制格式.
我对在我的库中处理这些数组的最佳方法感到困惑.我当前的设计似乎容易出错,因为如果创建任何新数组,我必须继续从默认的C顺序重塑东西.
目前的设计:
我有一些函数可以读取这些文件并返回numpy数组.读取函数的行为方式类似,基本上读取数据并返回如下内容:
return array.reshape((i, j, k), order='F')
我理解它的方式,我将fortran命令的视图返回到原始数组.
我的代码假设所有数组都是fortran顺序.这意味着任何可能创建新数组的新操作我都会确保reshape将其转换回fortran顺序.
这似乎非常容易出错,因为我必须密切关注任何创建新数组的操作,并确保将其重新整形为fortran顺序,因为默认值通常是C顺序.
我以后可能不得不再次将这些数组导出为二进制或ascii,并且需要维护fortran排序.所以,我用numpy.nditerfortran命令写出每个元素.
关注:
由于我通常以C顺序思考,因此当前的方法似乎非常容易出错.我担心我会因为错过调用reshape那些强迫C顺序的东西而被咬伤.
当前的方法似乎很混乱,因为索引可以被解释为不同的方式,事情可能会让人感到困惑.
x[(1, 2, 3)]对于fortran数组意味着k = 1,j = 2,并且i = 3,而x[(1, 2, 3)]对于C阶数组意味着k = 3,j = 2,i = 1是否正确?题:
做这种事情有最好的做法吗?在理想的世界中,我想阅读fortran有序数组,然后忘记排序,直到我导出到文件.但是,我担心我会不断误解索引等.
我已经阅读了我能找到的关于这个的唯一的numpy文档,http://docs.scipy.org/doc/numpy/reference/internals.html#multidimensional-array-indexing-order-issues.然而,这个概念对我来说似乎仍然很明显.也许我只需要对numpy docs进行不同的解释,http://docs.scipy.org/doc/numpy/reference/internals.html#multidimensional-array-indexing-order-issues.
使用PyQt4时,清除/删除小部件的"正确"或惯用方法是什么?
请考虑以下代码:
choices = ['a', 'b', 'c']
checkboxes = []
layout = QtGui.QVBoxLayout()
dialog = MyDialog()
for c in choices:
checkboxes.append(QtGui.QCheckBox(c)
layout.addWidget(chkbox)
dialog.setLayout(layout)
for c in checkboxes:
c.setParent(None)
c.deleteLater()
c = None
Run Code Online (Sandbox Code Playgroud)
上面的代码使用setParent(),deleteLater()和设置对象None.所有这些都是必要的吗?
另一种可能的情况是我有一个包含大量小部件的对话框,想要删除这些小部件并添加新的小部件.我不想"泄漏"旧的小部件,但我不确定这样做的正确方法是什么.
在我看来,deleteLater()可能永远不需要.它只是递减引用计数吗?如果是这样,不只是将变量设置为None做同样的事情吗?
我有一个相当大的涉及装饰器来调试我想动态添加到类的PyQt信号.有没有办法动态地向类中添加装饰器?
我可能从错误的角度处理这个问题,所以这就是我想要完成的.
到目前为止,我已经考虑了几种可能的解决方案:
object和PyQt的内置QtCore.QObject)之外,这将很容易.我想我可以将这个装饰器附加到我的基类,一切都会按预期运行.但是,在这个特定的应用中并非如此.我不想将所有类更改为具有相同的基类.object或QtCore.QObject:我不知道这将如何实际工作.但是,从理论上讲,我可以将其中一个基类更改__init__为new_init我在装饰器中定义的吗?这看起来真的很危险,但也许这是一个好方法?__metaclass__属性添加到我想要将装饰器注入的类中.我认为这是不可能的,因为要插入此属性,必须已经构造了类.因此,我定义的任何元类都不会被调用.这是真的? 我尝试了一些元类魔法的变种,但似乎没有任何效果.我觉得使用元类可能是实现我想要的方式,但我似乎无法让它工作.
再说一遍,我可能会把这一切都搞错了.基本上我想将上面引用的装饰器中的行为附加到我的应用程序中的所有类(甚至可能是选择类的列表).另外,如果有必要,我可以重构我的装饰师.如果我用装饰器或其他机制附加此行为,我真的不在乎.我只是假设这个装饰器已经完成了我想要的单个类,所以可能很容易扩展.
我正在尝试找到创建类装饰器的最佳方法,该装饰器执行以下操作:
__init__被称为目前,我只是保存对"原始" __init__方法的引用,并将其替换为__init__调用原始和我的附加功能的方法.它看起来类似于:
orig_init = cls.__init__
def new_init(self, *args, **kwargs):
"""
'Extend' wrapped class' __init__ so we can attach to all signals
automatically
"""
orig_init(self, *args, **kwargs)
self._debugSignals()
cls.__init__ = new_init
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来"扩充"原件__init__或在其他地方注入我的电话?我真正需要的只是self._debugSignals()在创建对象后的某个时间调用它.我也希望它自动发生,这就是为什么我认为以后__init__是一个好地方.
值得一提的是这个装饰器的一些背景知识.你可以在这里找到完整的代码.装饰器的要点是自动附加到任何PyQt信号并在它们被发射时打印.当我装饰我自己的子类时QtCore.QObject,装饰器工作正常,但是我最近一直试图自动装饰所有QObject孩子.
我希望在应用程序中有一个"调试"模式,我可以自动打印所有信号,以确保事情按照我的预期进行.我相信这会导致TONS的调试,但我仍然希望看到发生了什么.
问题是我当前版本的装饰器在更换时QtCore.QObject.__init__导致了段错误.我试图调试这个,但代码是所有SIP生成的,我没有太多的经验.
所以,我想知道是否有更安全,更pythonic的方式来注入一个函数调用后__init__,希望避免段错误.
我想拿两本字典并打印出它们的差异.此差异应包括键和值的差异.我已经创建了这个小片段,以使用unittest模块中的内置代码实现结果.然而,这是一个讨厌的黑客,因为我必须子类unittest.TestCase并提供一种runtest()方法来工作.此外,此代码将导致应用程序出错,因为它会AssertError在存在差异时引发.我真正想要的就是打印差异.
import unittest
class tmp(unittest.TestCase):
def __init__(self):
# Show full diff of objects (dicts could be HUGE and output truncated)
self.maxDiff = None
def runTest():
pass
_ = tmp()
_.assertDictEqual(d1, d2)
Run Code Online (Sandbox Code Playgroud)
我希望使用该difflib模块,但它看起来只适用于字符串.有没有办法解决这个问题并仍在使用difflib?