当我发现没有直接的方法对IList <T>进行排序或执行二进制搜索时,我感到非常惊讶.就像有一些静态方法来对数组进行排序和执行二进制搜索一样,我认为使用类似于IList <T>的静态方法会非常有用.
目前:
class Array
{
static Sort<T>(T[] array);
static int BinarySearch<T>(T[] array, T item);
}
Run Code Online (Sandbox Code Playgroud)
我希望他们会补充:
class List
{
static Sort<T>(IList<T> list);
static int BinarySearch<T>(IList<T> list, T item);
}
Run Code Online (Sandbox Code Playgroud)
我瞥了一眼.NET Framework 4.0 Beta SDK,但似乎仍然没有解决这个问题的方法.
我知道我可以通过创建一个扩展方法来解决这个问题,该方法检查它是否是List <T>然后使用List <T>实例进行排序/搜索; 但是,如果它不是List <T>的实例,那么我必须执行一个副本(对于非常大的列表很臭).我知道我可以做到这一切,但为什么呢?他们故意遗漏这个功能有什么理由吗?
为了尝试在.NET 4.0 Framework中实现这一点,我通过Microsoft的Connect程序创建了一个建议.如果你像我这样对这个问题感到沮丧,那就投票吧,也许它会被添加.
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=474201
我正在尝试使用boto从S3流式传输.gz文件并迭代解压缩的文本文件的行.神秘地,循环永远不会终止; 读取整个文件后,迭代将在文件开头重新开始.
假设我创建并上传如下输入文件:
> echo '{"key": "value"}' > foo.json
> gzip -9 foo.json
> aws s3 cp foo.json.gz s3://my-bucket/my-location/
Run Code Online (Sandbox Code Playgroud)
我运行以下Python脚本:
import boto
import gzip
connection = boto.connect_s3()
bucket = connection.get_bucket('my-bucket')
key = bucket.get_key('my-location/foo.json.gz')
gz_file = gzip.GzipFile(fileobj=key, mode='rb')
for line in gz_file:
print(line)
Run Code Online (Sandbox Code Playgroud)
结果是:
b'{"key": "value"}\n'
b'{"key": "value"}\n'
b'{"key": "value"}\n'
...forever...
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我认为必须有一些我非常缺乏的基本知识.
我正在尝试从SparkSQL表中有效地选择单个分区(S3中的镶木地板).但是,我看到Spark打开表中所有镶木地板文件的证据,而不仅仅是那些通过过滤器的文件.对于具有大量分区的表,这甚至会使小查询变得昂贵.
这是一个说明性的例子.我使用SparkSQL和Hive Metastore在S3上创建了一个简单的分区表:
# Make some data
df = pandas.DataFrame({'pk': ['a']*5+['b']*5+['c']*5,
'k': ['a', 'e', 'i', 'o', 'u']*3,
'v': range(15)})
# Convert to a SparkSQL DataFrame
sdf = hiveContext.createDataFrame(df)
# And save it
sdf.write.partitionBy('pk').saveAsTable('dataset',
format='parquet',
path='s3a://bucket/dataset')
Run Code Online (Sandbox Code Playgroud)
在后续会话中,我想选择此表的子集:
dataset = hiveContext.table('dataset')
filtered_dataset = dataset.filter(dataset.pk == 'b')
print filtered_dataset.toPandas()
Run Code Online (Sandbox Code Playgroud)
在随后打印的日志中,我看到应该发生修剪:
15/07/05 02:39:39 INFO DataSourceStrategy: Selected 1 partitions out of 3, pruned -200.0% partitions.
Run Code Online (Sandbox Code Playgroud)
但后来我看到所有分区都打开了镶木地板文件:
15/07/05 02:39:39 INFO S3AFileSystem: Reopening dataset/pk=a/part-r-00001.gz.parquet to seek to new offset 508
15/07/05 02:39:39 INFO S3AFileSystem: Actually …
Run Code Online (Sandbox Code Playgroud) 在Python中,我已经看到了使用holding或wrap来扩展对象或类的功能而不是继承的建议.特别是,我认为Alex Martelli在他的Python Design Patterns谈话中谈到了这一点.我已经在库中看到了这种用于依赖注入的模式,比如pycontainer.
我遇到的一个问题是,当我必须与使用isinstance反模式的代码进行交互时
,此模式会失败,因为保持/包装对象未通过isinstance
测试.如何设置保持/包装对象以绕过不必要的类型检查?一般可以这样做吗?在某种意义上,我需要类似于签名保留函数装饰器的类实例(例如,simple_decorator或Michele Simionato的装饰器).
资格:我并不断言所有isinstance
用法都不合适; 几个答案对此有所了解.也就是说,应该认识到isinstance
使用对对象交互构成了重大限制 - 它迫使继承成为多态性的来源,而不是行为.
关于这究竟是什么/为什么这是一个问题似乎有些混乱,所以让我提供一个简单的例子(广泛地从pycontainer中解除).假设我们有一个Foo类,还有一个FooFactory.为了举例,我们假设我们希望能够实例化记录每个函数调用的Foo对象,或者不想 - 想想AOP.此外,我们希望在不以任何方式修改Foo类/源的情况下这样做(例如,我们实际上可能正在实现一个可以动态地向任何类实例添加日志记录功能的通用工厂).对此的第一次尝试可能是:
class Foo(object):
def bar():
print 'We\'re out of Red Leicester.'
class LogWrapped(object):
def __init__(self, wrapped):
self.wrapped = wrapped
def __getattr__(self, name):
attr = getattr(self.wrapped, name)
if not callable(attr):
return attr
else:
def fun(*args, **kwargs):
print 'Calling ', name
attr(*args, **kwargs)
print 'Called ', name …
Run Code Online (Sandbox Code Playgroud)