我需要一个类似列表的对象,只要访问大于或等于其长度的插槽号就会"自动增长",用一些预先指定的默认值填充所有新创建的插槽.例如:
# hypothetical DefaultList class
x = DefaultList(list('abc'), default='*')
x[6] = 'g'
print x[2], x[4], x[6], x[8] # should print 'c * g *'
Run Code Online (Sandbox Code Playgroud)
谢谢!
PS.我知道实现这样的课程并不困难,但我尽可能避免轮胎改造,特别是如果一个特别有效/精心设计的轮子已经存在的话.
PS2.dict(或collections.defaultdict)不是所需数据结构的可接受实现.为什么,请看这里:http://groups.google.com/group/comp.lang.python/msg/bcf360dfe8e868d1?hl = en
我将Python对象定义为"在任何深度都是不可变的"iff
例如((1, 2), (3, 4))
,在任何深度都是不可变的,而((1, 2), [3, 4])
不是(尽管后者,由于是一个元组,"名义上"是不可变的).
有没有合理的方法来测试Python对象是否"在任何深度都是不可变的"?
测试第一个条件相对容易(例如使用collections.Hashable
类,忽略了不正确实现__hash__
方法的可能性),但第二个条件更难以测试,因为"容器"对象的异质性,以及迭代他们的"内容"......
谢谢!
到目前为止,这是我从函数中访问调用模块的问题的最佳解决方案:
import inspect
import sys
def calling_module(level=0):
filename = inspect.stack()[level+2][1]
modulename = inspect.getmodulename(filename)
try:
return sys.modules[modulename]
except KeyError:
return sys.modules['__main__']
Run Code Online (Sandbox Code Playgroud)
......但是在处理中隐含的KeyError
是(基本上没有根据的)假设它只有在filename
被运行时才会发生__main__
.
Python标准库是否提供了更强大的方法来执行此操作?
精简版:
作为第四个参数传递的函数accumarray
有时会被调用,其参数与编写第一个参数的规范不一致accumarray
.
因此,用作参数的函数accumarray
必须测试实际上是异常条件的内容.
问题是:如何对这种异常条件进行1表达式匿名函数测试?更一般地说:如何编写对accumarray
未记录的行为具有鲁棒性的匿名函数?
完整版本:
下面的代码是我今天大部分工作日的问题的彻底提炼版本.
首先是一些定义:
idxs = [1:3 1:3 1:3]';
vals0 = [1 4 6 3 5 7 6 Inf 2]';
vals1 = [1 Inf 6 3 5 7 6 4 2]';
anon = @(x) max(x(~isinf(x)));
Run Code Online (Sandbox Code Playgroud)
注释vals1
是vals0
通过交换元素2和8获得的."匿名"函数anon
计算其输入的非无限元素中的最大值.
鉴于这些定义,下面两个调用
accumarray(idxs, vals0, [], anon)
accumarray(idxs, vals1, [], anon)
Run Code Online (Sandbox Code Playgroud)
其区别仅在于在其第二个参数(vals0
VS vals1
)时,应产生相同的结果,因为之间的差vals0
和vals1
只影响在该参数的值与所述呼叫的一个排序anon
,并且该函数的结果是不敏感的排序其论点中的元素.
事实证明,这两个表达式中的第一个正常评估并产生正确的结果1:
>> accumarray(idxs, vals0, …
Run Code Online (Sandbox Code Playgroud) 我想要实现的函数需要知道当前版本的MATLAB是否至少与最近一样R2014a
.
是否有一种强大的,受支持的方式来执行此检查?
("强大,支持"我的意思是说我对脆弱的黑客不感兴趣,例如解析版本返回的字符串等)
BTW,在这种情况下,我想要这个检查的原因是知道我可以使用该功能matlab.lang.makeUniqueStrings
.如果有一种强大的,受支持的方式来检查此函数的可用性,我会使用它而不是测试当前的MATLAB是否足够新.不幸的是,似乎没有这样的检查:exist
对每个变量返回false我可以为此函数的名称提出.再一次,我可以想到脆弱的黑客来模仿正确的测试(例如which('matlab.lang.makeUniqueStrings')
),但它们并不比我上面提到的版本测试黑客好.
我发现的最佳解决方案是matlab.lang.makeUniqueStrings
在try-catch
块内运行命令.这仍然是一个脆弱的黑客,因为MATLAB
它没有提供强大的内置方式来捕获特定的异常!
IOW,这就是选择最糟糕的黑客.测试当前版本是否足够新(即使这个测试是一个脆弱的黑客)至少具有足够通用的优点,以坚持某些功能,并至少包含脆弱,hacky代码的扩散.
在下面的代码中,假设$sel
是一些任意的 d3.js选择:
$sel.each(function(d, i, j) {
var prev = ??? ;
...
});
Run Code Online (Sandbox Code Playgroud)
我可以替换???
分配给prev
由前一个兄弟this
组成的d3.js选择(如果存在的话)?
(如果this
是第一个孩子,因此没有先前的兄弟,应该分配一个空的d3.js选择prev
.)
我想实现一个可以"广播"的自定义事件,而不是发送到特定目标.只有那些已将自己注册为此类事件的侦听器的元素才会收到它们.
我的想法如下.
首先,在代码的不同位置,会有表单的陈述
some_subscriber.on_signal( 'some_signal', some_handler );
Run Code Online (Sandbox Code Playgroud)
我正在使用这个术语signal
作为"广播事件"的简写.在上面的表达式中some_subscriber
,通过为它提供一个处理程序,将自身注册为这种信号的一种类型(称为"some_signal")的监听器.
在代码的其他地方,会有表格的陈述
publisher.signal_types[ 'some_signal' ].broadcast( event_data );
Run Code Online (Sandbox Code Playgroud)
当执行这些语句时,会生成一个新事件并" 广播 ".我的意思是,调用该broadcast
方法的代码没有关于它发出的信号的侦听器的直接信息.
我已经实现这个想法的草图在此的jsfiddle,主要是为了说明我用文字描述的上述1.(它肯定不是生产级的,我不是特别相信它可以这么做.)
该实现的关键要素如下.首先,发布者对象不会跟踪他们的订阅者,这可以在这种发布者的工厂方法的实现中看到,如下所示:
function make_publisher ( signal_types ) {
// ...
var _
, signal = {}
, ping = function ( type ) {
signal[ type ].broadcast( ... );
}
;
signal_types.forEach( function ( type ) {
signal[ type ] = $.register_signal_type( type );
} );
return { signal_types: signal_types, ping: …
Run Code Online (Sandbox Code Playgroud) 注意:这个问题的目的是更好地理解Perl的按位运算符.我知道计算下面描述的数字U的方法.
我们$i
是一个非负整数.我正在寻找一个简单的表达式E<$i>
1,它将评估为无符号整数 U,其$i
最低位全为1,其余位均为0.例如,E<8>
应该是255.特别是,如果$i
等于机器的字长(W),则E<$i>
应该等于~0
2.
表达式(1 << $i) - 1
和~(~0 << $i)
两者都做正确的事情,除非$i
等于W,在这种情况下它们都采用值0
,而不是~0
.
我正在寻找一种不需要先计算W的方法.
编辑:好的,我想到了一个丑陋,沉闷的解决方案
$i < 1 ? 0 : do { my $j = 1 << $i - 1; $j < $j << 1 ? ( $j << 1 ) - 1 : ~0 } …
Run Code Online (Sandbox Code Playgroud) 我刚刚发现它`[<-`
可能具有破坏性的副作用,或者取决于它给出的参数.
例
x <- 1:5
x
# [1] 1 2 3 4 5
`[<-`(x, 1:5, 1)
# [1] 1 1 1 1 1
x
# [1] 1 2 3 4 5 # ? last application of `[<-` was non-destructive
`[<-`(x, 1:5, TRUE)
# [1] 1 1 1 1 1
x
# [1] 1 1 1 1 1 # ? the last application of `[<-` had a destructive side-effect
Run Code Online (Sandbox Code Playgroud)
问:是否有一个普遍可靠地防止破坏性的行为,或反对它至少后卫呢?(简而言之,`[<-`
完全避免.)
笔记
我无法在文档( …
python ×3
d3.js ×2
matlab ×2
accumarray ×1
broadcast ×1
brush ×1
events ×1
hashable ×1
immutability ×1
javascript ×1
jquery ×1
list ×1
nested ×1
perl ×1
r ×1
side-effects ×1