在Python中,object
该类充当所有(新式)类的根超类.至少默认情况下,应用str
和repr
任何子类的"类实例" object
会产生相同的结果:
>>> class spam(object): pass
...
>>> str(spam)
"<class '__main__.spam'>"
>>> str(spam) == repr(spam)
Run Code Online (Sandbox Code Playgroud)
我想定义的一个子类object
,比方说fancyobject
,也就是等同于object
以各种方式,不同之处在于施加str
和repr
对fancyobject
自身产生不同的输出:
>>> class ham(fancyobject): pass
...
>>> str(ham)
'ham'
>>> repr(ham)
"<class '__main__.ham'>"
Run Code Online (Sandbox Code Playgroud)
有没有办法在Python中执行此操作?
PS:我知道__str__
特殊的方法,但我的理解是,如果类A
重写__str__
,那么只有str
在实例上调用时才会调用重写方法A
,而不是在调用它A
本身时调用.即:
>>> class A(object):
... def __str__(self):
... return 'from new __str__: ' + object.__str__(self)
...
>>> str(A())
'from new …
Run Code Online (Sandbox Code Playgroud) 我的问题的主旨是这样的:
如何在Matlab的GUI(OS X)中显示Unicode字符,以便正确呈现它们?
细节:
我有一个存储在文件中的字符串表,其中一些字符串包含UTF-8编码的Unicode字符.我已尝试了许多不同的方法(这里列出太多)以在MATLAB GUI中显示该文件的内容,但没有成功.例如:
>> fid = fopen('/Users/kj/mytable.txt', 'r', 'n', 'UTF-8');
>> [x, x, x, enc] = fopen(fid); enc
enc =
UTF-8
>> tbl = textscan(fid, '%s', 35, 'delimiter', ',');
>> tbl{1}{1}
ans =
ÎÎÎÎÎΠΣΦΩαβγδεζηθικλμνξÏÏÏÏÏÏÏÏÏÏ
>>
Run Code Online (Sandbox Code Playgroud)
碰巧的是,如果我将字符串直接粘贴到MATLAB GUI中,粘贴的字符串会正确显示,这表明GUI基本上不能显示这些字符,但是一旦MATLAB读入它,它就会更长时间地显示它.例如:
>> pasted = '?????????????????????????????????'
pasted =
>>
Run Code Online (Sandbox Code Playgroud)
谢谢!
在通过命令行访问GitHub API时是否有某种方法可以使用基于ssh的身份验证(例如,通过curl等?).
FWIW,我尝试了以下的许多变体(改变了我指定我的公共ssh密钥文件的方式),但在每种情况下我仍然提示我输入密码:
% curl --pubkey ~/.ssh/id_rsa.pub --user yrstruly https://api.github.com/user/repos
Run Code Online (Sandbox Code Playgroud)
一个bash
函数应该如何测试它是否在Python virtualenv中运行?
想到的两种方法是:
[[ "$(type -t deactivate)" != function ]]; INVENV=$?
Run Code Online (Sandbox Code Playgroud)
要么
[[ "x$(which python)" != "x$VIRTUAL_ENV/bin/python" ]]; INVENV=$?
Run Code Online (Sandbox Code Playgroud)
(注意:$INVENV
如果我们在virtualenv中,想要为1,否则为0,这是迫使上面的向后看测试的原因.)
有什么不那么hacky?
如果我定义一个像这样的分层索引数据帧:
import itertools
import pandas as pd
import numpy as np
a = ('A', 'B')
i = (0, 1, 2)
b = (True, False)
idx = pd.MultiIndex.from_tuples(list(itertools.product(a, i, b)),
names=('Alpha', 'Int', 'Bool'))
df = pd.DataFrame(np.random.randn(len(idx), 7), index=idx,
columns=('I', 'II', 'III', 'IV', 'V', 'VI', 'VII'))
Run Code Online (Sandbox Code Playgroud)
内容看起来像这样:
In [19]: df
Out[19]:
I II III IV V VI VII
Alpha Int Bool
A 0 True -0.462924 1.210442 0.306737 0.325116 -1.320084 -0.831699 0.892865
False -0.850570 -0.949779 0.022074 -0.205575 -0.684794 -0.214307 -1.133833
1 True 0.603602 …
Run Code Online (Sandbox Code Playgroud) 一个小麻烦dict.setdefault
是它总是评估它的第二个参数(当然,当给出时),即使第一个参数已经是字典中的一个键.
例如:
import random
def noisy_default():
ret = random.randint(0, 10000000)
print 'noisy_default: returning %d' % ret
return ret
d = dict()
print d.setdefault(1, noisy_default())
print d.setdefault(1, noisy_default())
Run Code Online (Sandbox Code Playgroud)
这产生如下的ouptut:
noisy_default: returning 4063267
4063267
noisy_default: returning 628989
4063267
Run Code Online (Sandbox Code Playgroud)
当最后一行确认时,第二次执行noisy_default
是不必要的,因为此时密钥1
已经存在于d
(带有值4063267
)中.
是否有可能实现一个子类,dict
其setdefault
方法懒惰地计算其第二个参数?
编辑:
以下是受BrenBarn评论和Pavel Anossov的回答启发的实现.在此期间,我继续实施了懒惰版本的get,因为基本的想法基本相同.
class LazyDict(dict):
def get(self, key, thunk=None):
return (self[key] if key in self else
thunk() if callable(thunk) else
thunk)
def setdefault(self, key, thunk=None):
return (self[key] if …
Run Code Online (Sandbox Code Playgroud) 我经常遇到需要将一个序列拆分为满足和不满足给定谓词的元素的两个子序列(保留原始的相对排序).
这个假设的"分离器"功能看起来像这样:
>>> data = map(str, range(14))
>>> pred = lambda i: int(i) % 3 == 2
>>> splitter(data, pred)
[('2', '5', '8', '11'), ('0', '1', '3', '4', '6', '7', '9', '10', '12', '13')]
Run Code Online (Sandbox Code Playgroud)
我的问题是:
Python已经有标准/内置方式来做到这一点吗?
这个功能当然不难编码(参见下面的附录),但由于多种原因,我更喜欢使用标准/内置方法而不是自动方法.
谢谢!
附录:
到目前为止,我发现用于在Python中处理此任务的最佳标准函数是itertools.groupby
.但是,要将它用于此特定任务,必须为每个列表成员调用谓词函数两次,我觉得这很烦人:
>>> import itertools as it
>>> [tuple(v[1]) for v in it.groupby(sorted(data, key=pred), key=pred)]
[('0', '1', '3', '4', '6', '7', '9', '10', '12', '13'), ('2', '5', '8', '11')]
Run Code Online (Sandbox Code Playgroud)
(上面的最后一个输出与前面所示的那个不同之处在于,满足谓词的元素的子序列是最后一个而不是第一个,但这非常小,如果需要很容易修复.)
人们可以避免对谓词的冗余调用(基本上,通过"内联memoization"),但我对此的最好的抨击得到了相当精细,与以下简单性相去甚远splitter(data, pred)
:
>>> first = lambda t: t[0] …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将一个非常简单的(Unix)shell脚本转换为"批处理文件".除了线路,我大部分时间都没下来
CURRENTDIR="$PWD"
Run Code Online (Sandbox Code Playgroud)
我怎么能把它翻译成"batchese"?
谢谢!
s{1}
标题的" 烦恼"是指下面的for-block中的第一行:
for s = some_cell_array
s = s{1}; % unpeel the enclosing cell
% do stuff with s
end
Run Code Online (Sandbox Code Playgroud)
这项s = s{1}
业务是必要的,因为迭代过程some_cell_array
并不真正迭代内容some_cell_array
,而是遍历1个元素的单元格,每个单元格包含一个项目some_cell_array
.
撇开谁可能希望将此行为作为默认值的问题,是否有任何方法可以迭代裸机的内容some_cell_array
?
Firefox是否对该alignment-baseline
物业有任何支持?当我检查(使用Firebug)alignment-baseline
已明确设置属性的SVG元素时,Firebug根本不会列出此属性(IOW它将其视为噪声).无论我赋予此属性的值是什么,显示文本的外观都不会改变,这进一步表明FF完全忽略了这个属性.
(FF对此属性的支持可能被破坏的另一个迹象是,上面引用的关于此属性的CSS文档的页面中给出的链接是死的 - 作为doornail.)
假设,如果看起来,FF不支持该alignment-baseline
属性,这个属性最接近复制FF默认行为的值是多少?
编辑:例如,使用Chrome和FF 查看此jsFiddle ; 每行显示的文本都显示一个突出显示的单词,该单词是使用以下形式的代码生成的:
<tspan style="alignment-baseline:alphabetic">alphabetic</tspan>
Run Code Online (Sandbox Code Playgroud)
请注意,所有行在FF中看起来都相同,但在Chrome中则不然.
有几个可能的候选值此属性复制FF的默认行为(即auto
,alphabetic
,mathematic
和inherit
); 不幸的是,这个实验无法决定这个问题,而且我不清楚哪种可能的选项会在最大部分情况下与FF的默认行为相匹配.