当通过ssh连接到远程主机时,我经常想将该系统上的文件带到本地系统进行查看或处理.有没有办法复制文件而没有(a)打开一个新终端/暂停ssh会话(b)再次验证本地或远程主机工作(c)即使一个或两个主机在后面NAT路由器?
目标是利用尽可能多的当前状态:两台机器之间存在连接,我在两者上都进行了身份验证,我在文件的工作目录中 - 所以我不必打开另一个终端并复制并粘贴远程主机和路径,这就是我现在所做的.最好的解决方案也不需要在会话开始之前进行任何设置,但如果设置是一次性的或能够自动化,那么这是完全可以接受的.
我有一些混合类型的数据,我想存储在某种R数据结构中.每个数据点都有一组固定属性,可以是一维数字,因子或字符,也可以是一组可变长度数据.例如:
id phrase num_tokens token_lengths
1 "hello world" 2 5 5
2 "greetings" 1 9
3 "take me to your leader" 4 4 2 2 4 6
Run Code Online (Sandbox Code Playgroud)
实际值并非都可以相互计算,但这就是数据的味道.我想要做的操作包括基于布尔函数对数据进行子集化(例如,nchar(data$phrase) > 10或者类似的东西lapply(data$token_lengths, length) > 2).我也想通过索引对变量长度部分中的值进行索引和平均.这不起作用,但是喜欢:mean(data$token_lengths[1], na.rm=TRUE))
我发现通过使它成为一个数组,我可以将"token_lengths"塞进一个data.frame:
d <- data.frame(id=c(1,2,3), ..., token_lengths=as.array(list(c(5,5), 9, c(4,2,2,4,6)))
Run Code Online (Sandbox Code Playgroud)
但这是最好的方法吗?
我的数据处理中的一个常见模式是按一组列进行分组,应用过滤器,然后再次展平.例如:
my_data_grouped = group my_data by some_column;
my_data_grouped = filter my_data_grouped by <some expression>;
my_data = foreach my_data_grouped flatten(my_data);
Run Code Online (Sandbox Code Playgroud)
这里的问题是,如果my_data在此操作之后以类似(c1,c2,c3)的模式开始,它将具有类似(mydata :: c1,mydata :: c2,mydata :: c3)的模式.如果列是唯一的,有没有办法轻松剥离"mydata ::"前缀?
我知道我可以这样做:
my_data = foreach my_data generate c1 as c1, c2 as c2, c3 as c3;
Run Code Online (Sandbox Code Playgroud)
然而,对于具有大量列的数据集而言,这很难维护并且对于具有可变列的数据集是不可能的.
如果使用-i选项调用cpython解释器,它将在完成运行的任何命令或脚本后进入交互模式.有没有办法在一个程序中让解释器执行此操作,即使它没有给出-i?明显的用例是在发生异常情况时通过交互式检查状态进行调试.
Python 2.7的argparse为您提供了两个扩展点,您可以在其中控制命令行参数的解析方式:键入函数和操作类.
从内置类型和操作开始,最佳实践似乎是类型函数应该包含验证/初始化代码,并且操作应该关注将值存储到命名空间中.这种方法的问题是当你有类型检查代码有副作用.考虑这个简单的例子:
from argparse import ArgumentParser, FileType
argp = ArgumentParser()
argp.add_argument('-o', type=FileType('w'), default='myprog.out')
argp.parse_args(['-o', 'debug.out'])
Run Code Online (Sandbox Code Playgroud)
如果你运行它,你会发现python将在系统上打开两个文件,myprog.out并且debug.out.仅debug.out当用户不提供-o参数时才打开更有意义.
稍微调整一下,似乎argparse只会在传递的参数或str类型的默认参数上调用你的类型函数.如果你的类型检查器有副作用,这是很不幸的,因为即使传递了一个值,它也会在默认情况下被调用.因此,对于带有副作用的初始化,也许最好在动作中执行此操作.这样做的问题是,如果您提供默认值,则不会调用该操作!
请考虑以下代码:
from argparse import ArgumentParser, Action
def mytype(arg):
print 'checking type for ' + repr(arg)
return arg
class OutputFileAction(Action):
def __call__(self, parser, namespace, values, option_string=None):
print 'running action for ' + repr(values)
try:
outstream = open(values, 'w')
except IOError as e:
raise ArgumentError('error opening file ' + values)
setattr(namespace, self.dest, outstream)
argp …Run Code Online (Sandbox Code Playgroud) 我是新手,来自cvs-> svn-> git的历史.我很难看到影响一组文件的最新更改的紧凑表示.例如,如果我转到目录并键入:
% p4 filelog .
Run Code Online (Sandbox Code Playgroud)
它没有做任何有用的事情.更有趣的是
% p4 filelog *
Run Code Online (Sandbox Code Playgroud)
但是,这会向我显示每个文件的单独更改历史记录.我宁愿看到一个统一的格式变化视图,显示:更改号码,提交消息,更改最近N个提交的文件.
使用perforce,用户可以通过Reviews在用户记录字段中指定更改来获取特定文件或目录更改的电子邮件通知(Perforce文档中的更多详细信息).
但是,我希望将电子邮件通知发送到团队邮件列表,这当然不是perforce用户.实现这一目标的一种方法是让一个团队成员将邮件列表放入他的电子邮件地址,而另一个是为邮件列表创建一个用户帐户(这需要另一个许可证吗?).当然,必须有更好的方法.
我正在使用Python API,希望我将它传递给函数.但是,由于各种原因,我想传递一个方法,因为我希望函数的行为不同,具体取决于它所属的实例.如果我传递一个方法,API将不会使用正确的'self'参数调用它,所以我想知道如何将方法转换为一个知道它属于'self'的函数.
我可以想到有几种方法可以做到这一点,包括使用lambda和闭包.我在下面列举了一些这样的例子,但我想知道是否有一种达到同样效果的标准机制.
class A(object):
def hello(self, salutation):
print('%s, my name is %s' % (salutation, str(self)))
def bind_hello1(self):
return lambda x: self.hello(x)
def bind_hello2(self):
def hello2(*args):
self.hello(*args)
return hello2
>>> a1, a2 = A(), A()
>>> a1.hello('Greetings'); a2.hello('Greetings')
Greetings, my name is <__main__.A object at 0x71570>
Greetings, my name is <__main__.A object at 0x71590>
>>> f1, f2 = a1.bind_hello1(), a2.bind_hello1()
>>> f1('Salutations'); f2('Salutations')
Salutations, my name is <__main__.A object at 0x71570>
Salutations, my name is <__main__.A object at 0x71590>
>>> …Run Code Online (Sandbox Code Playgroud) 我正在编写一些优化的C代码,它基本上通过一个数组运行,并为每个元素做一些事情.它的作用取决于元素的当前值,如下所示:
for (i=0; i < a_len; i++) {
if (a[i] == 0) {
a[i] = f1(a[i]);
} else if (a[i] % 2 == 0) {
a[i] = f2(a[i]);
} else {
a[i] = 0;
}
Run Code Online (Sandbox Code Playgroud)
我在动态语言工作多年后回到C,我的做法是尝试编写简单的代码而不是为我可以直接引用的东西创建大量局部变量,如上面的[i]. 我非常清楚最佳实践是编写可读代码并相信编译器比您更聪明,并且会做出很好的优化.
如果我在汇编程序中编写上面的代码,我会将[i]加载到寄存器中,然后每次只使用该值,因为我知道[]是私有内存,并且不会在引用之间进行更改.但是,即使是智能编译器也可能每次都加载,因为它无法确定内存是否已更改.(或者我必须为编译器显式声明"a"volatile以不进行此优化吗?).
所以,我的问题是:我是否应该通过使用像这样的局部变量重写来获得更好的性能:
for (i=0; i < a_len; i++) {
val = a[i];
if (val == 0) {
a[i] = f1(val);
} else if (val % 2 == 0) {
a[i] = f2(val);
} else {
a[i] = 0;
}
Run Code Online (Sandbox Code Playgroud)
或者像-O3这样的东西会自动为我处理吗?我正在优化的代码需要数天才能运行,因此即使是适度的改进也会产生影响.
在C程序中,当您编写像3.14159这样的浮点文字时,是否有标准解释或者它是编译器还是体系结构依赖?Java 非常清楚如何解释浮点字符串,但是当我阅读K&R或其他C文档时,这个问题似乎已经被扫地出门了.