我正在尝试将一个冗长的空洞"数据"类转换为一个命名元组.我的班级目前看起来像这样:
class Node(object):
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
Run Code Online (Sandbox Code Playgroud)
转换为namedtuple
它后看起来像:
from collections import namedtuple
Node = namedtuple('Node', 'val left right')
Run Code Online (Sandbox Code Playgroud)
但这里有一个问题.我的原始类允许我传入一个值,并使用命名/关键字参数的默认值来处理默认值.就像是:
class BinaryTree(object):
def __init__(self, val):
self.root = Node(val)
Run Code Online (Sandbox Code Playgroud)
但是这对我重构的名为元组的情况不起作用,因为它希望我传递所有字段.当然,我可以代替的出现Node(val)
到Node(val, None, None)
,但它不是我的胃口.
所以确实存在着一个很好的技巧,它可以使我重新写成功无需添加大量的代码复杂度(元编程),或者我应该只吞下药丸,并与"查找和替换"继续前进?:)
我最近在使用Vim很长一段时间之后开始使用Emacs(和那里的许多其他人一样),我个人觉得Vim移动键和文本对象是编辑器可以拥有的最好的东西之一.我听说过使用不同的插件在Emacs中模拟这些功能,但是在互联网上阅读了一些之后,我很困惑.
我特别遇到了三种模式:Viper,Vimpulse和Evil.有人可以帮助我了解如何使用这些模式来实现近乎完美的Vim仿真吗?我需要安装所有这三个吗?他们之间有什么区别?谢谢.
我对Python中的类型和类有点困惑.例如,以下REPL对话让我困惑:
>>> class A: pass
...
>>> a = A()
>>> type(a)
<type 'instance'>
>>> a.__class__
<class __main__.A at 0xb770756c>
>>> type([])
<type 'list'>
>>> [].__class__
<type 'list'>
>>> type(list)
<type 'type'>
>>> list.__class__
<type 'type'>
>>> type(A)
<type 'classobj'>
>>> A.__class__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: class A has no attribute '__class__'
Run Code Online (Sandbox Code Playgroud)
__class__
用户定义的类?任何解释/进一步阅读可以澄清这种行为将非常感激.TIA.
在学习Python时,通过典型的Point类示例,我注意到由于某种原因,我不能拥有与类相同类型的类级别(静态变量).例如
class Point:
ORIGIN = Point() # doesn't work
def __init__(self, x=0, y=0):
self.x = x
self.y = y
Run Code Online (Sandbox Code Playgroud)
虽然在Java中也是如此:
class Point {
public static void main(final String[] args) { }
private static final Point ORIGIN = new Point(0, 0);
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:有没有办法在Python中实现相同的目标.现在我依赖于模块级变量,我不喜欢那个解决方案.还有,有什么理由说它不能在课堂上完成吗?
我目前正在尝试将一些Java代码转换为Scala代码.挑战在于确保转换后的Scala代码与原始Java代码相比,最终不会做出非常低效的事情.例如,当尝试转换以下代码时:
class Person {
String name;
Integer age;
Character gender;
}
public class TestJava {
public static void main(String[] args) {
final List<Person> persons = new ArrayList<>();
final List<Person> males = new ArrayList<>();
final List<Person> aNames = new ArrayList<>();
final List<Person> seniors = new ArrayList<>();
for (final Person p: persons) {
if (p.gender == 'm') {
males.add(p);
}
if (p.age >= 60) {
seniors.add(p);
}
if (p.name.startsWith("a")) {
aNames.add(p);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于Java依赖于变异,因此该代码看起来很合理.但是,现在我想将它转换为Scala等价物而不会多次循环遍历该集合(在这种情况下为3次).
我当然可以使用List …
我想在尝试理解Ruby中的实例变量时我会有点疯狂.我唯一的目标是确保为给定类创建的每个对象都有一个具有预定值的变量,而无需initialize
为该类编写方法.就像是:
class Test
@my = []
attr_accessor :my
end
t = Test.new
t.my # I want [] but this shows nil
Run Code Online (Sandbox Code Playgroud)
是否有可能实现这一目标而不触及initialize
?谢谢.
编辑:为了澄清,我正在编写一些代码,这些代码的执行类似于attr_accessor
它将实例变量添加到执行它的类中.如果我自己编写initialize
,我最终会破坏用户编写的那个.
我最近在Windows XP SP3机器上安装了SBT以开始使用Scala.当我最初启动时,它开始从远程位置抓取所有JAR - 非常像Maven或任何其他依赖管理工具.
但是,每当我更改目录并启动时sbt
,它都会再次开始下载整个解决方案.有没有办法维护一个全局缓存,工件只下载一次,而不是每次我更改工作目录?
我正在寻找JDK的调试(或他们称之为快速调试版本)以启用在运行时生成的打印组件以及在追踪性能问题时所需的其他诊断.就目前而言,我似乎找不到可以直接使用的"准备好"的快速调试构建二进制包.有人可以帮我提供下载链接或者至少提供一些提示,说明获得这些构建的阻力最小的路径是什么?
豪迪人.我目前正在创建一个"共享"库(也就是Windows上的DLL),而后者依赖于"Boost C++"库来获取日期时间功能.我注意到我的Boost安装(通过Boostpro完成)lib
在boost安装目录中有一些DLL和LIB文件.好的,我认为有必要,所以我将它们添加到我的IDE中的库依赖项中.
现在我要做的是编写使用boost日期时间库的代码,创建一个共享库并从独立的可执行文件中使用它.它工作,即使我刚刚将我创建的共享库复制到可执行文件夹而不是boost_date_time-vc100-mt-1_47.dll
文件.奇怪.现在我要做的是从我的项目中删除Boost的DLL /库依赖项并构建共享库.它仍然有效.
我有点困惑.如果Boost库只是标题,为什么我的Boostpro安装有*.lib和*.dll文件用于datetime和其他boost部件?是否有任何情况我想使用它们,因为那些升级库无论如何都被编译到我的共享库中?
希望我很清楚,如果需要更多说明,请告诉我.还有FWIW,我正在使用Eclipse CDT + MingW.
我一直在尝试在我的Java应用程序中检索"unicode用户输入"以获取一个小实用程序代码段.问题是,它似乎正在Ubuntu"开箱即用",我猜想在UTF-8上运行OS宽编码,但从"cmd"运行时无法在Windows上运行.考虑的代码如下:
public class SerTest {
public static void main(String[] args) throws Exception {
testUnicode();
}
public static void testUnicode() throws Exception {
System.out.println("Default charset: " +
Charset.defaultCharset().name());
BufferedReader in =
new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
System.out.printf("Enter '????? ???': ");
String line = in.readLine();
String s = "????? ???";
byte[] sBytes = s.getBytes();
System.out.println("strg bytes: " + Arrays.toString(sBytes));
byte[] lineBytes = line.getBytes();
System.out.println("line bytes: " + Arrays.toString(lineBytes));
PrintStream out = new PrintStream(System.out, true, "UTF-8");
out.print("--->" + s + "<----\n");
out.print("--->" + line …
Run Code Online (Sandbox Code Playgroud)