通常,在大型项目的上下文中,将现有的,无处不在的接口用于功能接口是否安全?
例如,给定一个现有的接口和类:
public interface Interface {
public double calculateSomething(double x);
public void doSomething();
}
Run Code Online (Sandbox Code Playgroud)
由...实施
class InterfaceImplementer implements Interface {
public double calculateSomething(double x) {
return 2 * x;
}
public void doSomething() {
// insert specific behavior here
}
}
Run Code Online (Sandbox Code Playgroud)
我可以通过定义除一个方法之外的所有方法来安全地更改界面:
public interface Interface {
public double calculateSomething(double x);
default void doSomething() {
// insert some default behavior here
}
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以将对象定义为
Interface object = new InterfaceImplementer() {
@Override
public double calculateSomething(double x) {
return 2 * x;
} …Run Code Online (Sandbox Code Playgroud) 我有一个类的名称可能不必要地繁琐,其中包含许多我在其他地方使用的静态方法。
而不是用很多填充我的代码
VeryUnnecessarilyLongCumbersomeName.doThingFoo();
VeryUnnecessarilyLongCumbersomeName.doThingBar();
VeryUnnecessarilyLongCumbersomeName.doThingEgg();
VeryUnnecessarilyLongCumbersomeName.doThingSpam();
Run Code Online (Sandbox Code Playgroud)
我宁愿有
VeryUnnecessarilyLongCumbersomeName thing = new VeryUnnecessarilyLongCumbersomeName();
thing.doThingFoo();
thing.doThingBar();
thing.doThingEgg();
thing.doThingSpam();
Run Code Online (Sandbox Code Playgroud)
但是,这得到了警告
"the static method doThingFoo() should be accessed in a static way."
Run Code Online (Sandbox Code Playgroud)
我知道这里有多种解决方案。使用更好的类名。让它不是静态的。忽略它,因为它只是一个警告。
但我实际上并不认为这应该是一个警告。这样做有什么危害?是否有一种更优雅/正确的方法可以使我的代码不那么笨拙,这不是上述解决方案之一?
注意:我怀疑这可能需要coding-style标记,因此被认为是题外话并被拒绝。然而,我认为这里有这样一个问题的空间,所以我把它留给你们。
这是我对 Boto 和 AWS 的完整新手介绍。目前我唯一的目标是能够访问外部机构的 S3 存储桶,因此我特别想了解如何使用它们。这个最小的代码完成了我想要它做的事情,但我还没有弄清楚如何通过仅将 s3r 声明为资源并避免使用 s3 作为客户端来使用它。似乎最好从 S3 资源访问存储桶,然后专门使用该存储桶,即bucket.new_key('testdir/')或bucket.put_object(Key=('testdir/))。这是可能的,还是有一个很好的理由来重新构建我的处理方式?谢谢!
import boto3
bucket_name = 'my-bucket-name'
region_name = 'my-region-name'
print('Acquiring s3 service')
s3 = boto3.client('s3', region_name=region_name)
s3r = boto3.resource('s3', region_name=region_name)OB
print('Accessing bucket')
bucket = s3r.Bucket(bucket_name)
print('Emptying bucket')
bucket.objects.all().delete()
print('Uploading folder structures')
s3.put_object(Bucket=bucket_name, Key=('testdir/'))
s3.put_object(Bucket=bucket_name, Key=('testdir/subdir1/'))
s3.put_object(Bucket=bucket_name, Key=('testdir/subdir2/'))
Run Code Online (Sandbox Code Playgroud) 我正在编写代码将CSV转换为XML.假设我有一个列表,如:
input = ['name', 'val', 0, \
'name', 'val', 1, 'tag', 'val', \
'name', 'val', 2, 'tag', 'val', 'tag', 'val', \
'name', 'val', 0]
Run Code Online (Sandbox Code Playgroud)
此列表的每个切片以"name"开头,表示具有名称,值和可变标记值对的可变数量的元素.
我想把它变成:
output = [['name', 'val', []],
['name', 'val', ['tag', 'val']],
['name', 'val', ['tag', 'val', 'tag', 'val']],
['name', 'val', []]]
Run Code Online (Sandbox Code Playgroud)
无需将标记值对分隔为元组,这是在单独的方法中处理的.我有一个解决方案,但它不是非常pythonic:
output=[]
cursor=0
while cursor < len(input):
name=input[cursor]
val=input[cursor+1]
ntags=int(input[cursor+2])
optslice=input[cursor+3:cursor+3+2*ntags]
cursor = cursor+3+2*ntags
print name, val, ntags, optslice, cursor
output.append([name, val, optslice])
print output
> name val 0 [] 3
> name val 1 ['tag', …Run Code Online (Sandbox Code Playgroud)