我们的开发团队使用PEP8 linter,最大行长为80个字符.
当我在python中编写单元测试时,我喜欢用描述性的方法名来描述每个测试的作用.然而,这通常会导致我超出角色限制.
这是一个太长的函数的例子......
class ClientConnectionTest(unittest.TestCase):
def test_that_client_event_listener_receives_connection_refused_error_without_server(self):
self.given_server_is_offline()
self.given_client_connection()
self.when_client_connection_starts()
self.then_client_receives_connection_refused_error()
Run Code Online (Sandbox Code Playgroud)
你可以写更短的方法名称!
我知道,但我不想失去测试名称的描述性.
您可以在每个测试之上编写多行注释,而不是使用长名称!
这是一个不错的主意,但是当我在IDE(PyCharm)中运行测试时,我将无法看到测试名称.
也许你可以用反斜杠(逻辑行继续符)继续行.
不幸的是,这不是Python中的一个选项,正如Dan的回答中提到的那样.
你可以停止linting你的测试.
这在某些方面是有道理的,但鼓励格式良好的测试套件是很好的.
您可以增加行长度限制.
我们的团队喜欢有限制,因为它有助于在窄显示屏上保持代码可读,因此这不是最佳选择.
您可以
test从方法的开头删除.
这不是一个选择.Python的测试运行器需要所有测试方法开始,test否则它们不会接收它们.
编辑:一些测试运行器允许您在搜索测试函数时指定正则表达式,但我不想这样做,因为它是为项目所有人工作的额外设置.此外,它并没有真正回答原来的问题.
您可以将EventListener分隔为自己的类并单独测试它.
事件监听器属于自己的类(并经过测试).它只是一个由ClientConnection中发生的事件触发的接口.这种建议似乎有很好的意图,但是被误导,并没有帮助回答原始问题.
您可以使用像Behave这样的BDD框架.它专为表达测试而设计.
这是事实,我希望将来可以使用更多这些.虽然我仍然想知道如何跨行分割函数名称.
Python中是否有一种方法可以跨多行拆分长函数声明?
例如...
def test_that_client_event_listener_receives_
connection_refused_error_without_server(self):
self.given_server_is_offline()
self.given_client_connection()
self.when_client_connection_starts()
self.then_client_receives_connection_refused_error()
Run Code Online (Sandbox Code Playgroud)
或者我必须自己咬紧牙关并缩短它?
如果我喜欢网站的一个元素,并且我想将它实现到我的网站中,那么最简单的方法是什么?有时会有很多CSS文件,很难跟踪所有这些文件.
React 有一个名为useState的钩子,它在向功能组件添加状态时使用。
使用状态:
Run Code Online (Sandbox Code Playgroud)const [state, setState] = useState(initialState);返回一个有状态的值和一个更新它的函数。
在初始渲染期间,返回的状态 (
state) 与作为第一个参数 (initialState)传递的值相同。该
setState函数用于更新状态。它接受一个新的状态值并将组件的重新渲染排入队列。
我们传递什么
useState作为参数?
useState()Hook的唯一参数是初始状态。与类不同,状态不必是一个对象。如果这就是我们所需要的,我们可以保留一个数字或一个字符串。在我们的例子中,我们只想要一个用户点击次数的数字,所以0作为我们变量的初始状态传递。(如果我们想在 state 中存储两个不同的值,我们会调用useState()两次。)
但是,我注意到了一些奇怪的、看似无证的行为。
如果我尝试使用useState钩子将函数存储为状态,react 将调用函数引用。例如
const arbitraryFunction = () => {
console.log("I have been invoked!");
return 100;
};
const MyComponent = () => {
// Trying to store a string - works as expected:
const …Run Code Online (Sandbox Code Playgroud) 注释需要类对象而不是该类实例的函数参数的正确方法是什么?
在下面的例子中,some_class参数应该是一个类型实例(它是一个类),但这里的问题type太宽泛了:
def construct(some_class: type, related_data:Dict[str, Any]) -> Any:
...
Run Code Online (Sandbox Code Playgroud)
在some_class需要特定类型对象的情况下,使用type根本没有帮助.该typing模块可能需要一个Class泛型来执行此操作:
def construct(some_class: Class[Union[Foo, Bar, Baz]], related_data:Dict[str, Any]) -> Union[Foo, Bar, Baz]:
...
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,some_class是Foo,Bar或Faz类,而不是它的一个实例.它们在类树中的位置无关紧要,因为它some_class: Class[Foo]也应该是一个有效的案例.因此,
# classes are callable, so it is OK
inst = some_class(**related_data)
Run Code Online (Sandbox Code Playgroud)
要么
# instances does not have __name__
clsname = some_class.__name__
Run Code Online (Sandbox Code Playgroud)
要么
# an operation that only Foo, Bar and Baz can perform.
some_class.a_common_classmethod()
Run Code Online (Sandbox Code Playgroud)
应该是mypy,pytype,PyCharm等等. …
我有一个需要多个Ints 的vararg函数.我有一个Array<Int>我想用作输入的东西.
这是我尝试使用Spread Operator调用该函数:
fun printNumbers(vararg numbers: Int) {
numbers.forEach { it -> println(it) }
}
val numbers: Array<Int> = arrayOf(1, 2, 3)
printNumbers(*numbers)
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下类型不匹配错误:
error: type mismatch: inferred type is Array<Int> but IntArray was expected
printNumbers(*arrayOf<Int>(1, 2, 3))
^
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我会收到这个错误,特别是因为我可以使用扩展运算符Array<String>.例如...
fun printStrings(vararg strings: String) {
strings.forEach { it -> println(it) }
}
val strings: Array<String> = arrayOf("hello", "there", "stackoverflow")
printStrings(*strings)
Run Code Online (Sandbox Code Playgroud)
输出:
hello
there
stackoverflow
Run Code Online (Sandbox Code Playgroud)
我在网上搜索是否可以转换Array<Int>为a IntArray …
在c语言中我有类似的东西:
if(cond1)
{}
else if(cond2)
{}
else
{}
Run Code Online (Sandbox Code Playgroud)
这怎么可能在Prolog?
使用java-9 build 9-ea + 149 和jol 0.6.
运行这个简单的代码:
ArrayList<Integer> list = new ArrayList<>();
list.add(12);
System.out.println(ClassLayout.parseInstance(list).toPrintable());
Run Code Online (Sandbox Code Playgroud)
输出:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) 0e 8d 00 f8 (00001110 10001101 00000000 11111000) (-134181618)
12 4 int AbstractList.modCount (access denied)
16 4 int ArrayList.size (access denied)
20 4 Object[] ArrayList.elementData (access denied)
Run Code Online (Sandbox Code Playgroud)
此访问被拒绝的部分来自方法中的FieldData.java: …
编辑:我意识到这种模式感觉很像currying,这是一种功能程序员在调用之前用来指定函数参数的技术.这里的区别在于我们在对象上讨论构造函数而不是简单地使用函数.
在整个几个项目中,我发现自己使用了这个奇怪的设计模式,我找不到它的名字.它有名字吗?也许这只是不好的做法,你告诉我.
有了这种模式,你会......
我将定义一个假设的场景来提供一些上下文.
Bob正在编写一个用于扫描源代码的小API.他希望能够检查注释是否在源代码中的给定索引处开始/结束.
这是鲍勃的代码.
public abstract class CommentDetector {
private final String startPattern;
private final String endPattern;
protected CommentDetector(String startPattern, String endPattern) {
this.startPattern = startPattern;
this.endPattern = endPattern;
}
public boolean commentStartsAt(int index, String sourceCode) {
// ...
}
public boolean commentEndsAt(int index, String sourceCode) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
您可能想知道为什么它是抽象的但没有抽象方法.这只是因为Bob 不希望您直接实例化它.Bob希望你编写一个实现,CommentDetector然后实例化它.以下是Bob的两个实现......
一个用于Java中的多行注释: …
是否可以创建一个扩展函数并将其称为静态?
fun System.sayByeAndExit() {
println("Goodbye!")
System.exit()
}
fun main(args: Array<String>) {
System.sayByeAndExit() // I'd like to be able to call this
}
Run Code Online (Sandbox Code Playgroud)
我理解kotlin的扩展函数是静态解析的,如Kotlin Reference(扩展函数)中所述,但这并不意味着它们可以被调用,就好像它们是类中的静态函数(在Java意义上).
我也明白这个代码不起作用,因为没有 System的实例传递给编译器将生成的方法; 因此它不会编译.
有些人可能想知道为什么这种行为是可取的.我能理解为什么你会认为不是,所以这里有一些原因:
Kotlin有办法将静态函数"挂钩"到类中吗?我很想知道.
快速介绍:
对于那些不知道的人;Jollyday是一个 API,可帮助您处理假期感知代码。它允许您从预构建的配置中检索公共假期。您甚至可以在 XML 文件中创建自己的假日配置并将其加载到 API 中,这正是我想要做的。
我已经在 XML 文件中创建了自己的假期配置,并且想将其加载到 Jollyday 中。
Jollyday 官方文档 (版本 0.5.1) 显示了使用以下代码完成此操作的示例...
URL url = new URL("file:some/path/MyHolidays.xml");
HolidayManager m = HolidayManager.getInstance(url);
Run Code Online (Sandbox Code Playgroud)
当我尝试使用此代码时,它不会编译,因为HolidayManager该类没有方法getInstance(URL)。
HolidayManager.getInstance() 这是(从 IntelliJ IDEA 中看到的)所有重载变体的屏幕截图。
该文档似乎不正确。
“您使用的 API 版本正确吗?”
是的,我使用的是0.5.1 版本,是通过 gradle 下载的。这与文档中使用的版本相同。
是否可以使用 URL 创建 HolidayManager 实例?
如果是这样,是如何做到的?
java ×3
kotlin ×2
python ×2
annotations ×1
arrays ×1
css ×1
html ×1
inheritance ×1
java-9 ×1
javascript ×1
jol ×1
nomenclature ×1
oop ×1
prolog ×1
react-hooks ×1
reactjs ×1
type-hinting ×1