小编byx*_*xor的帖子

是否可以跨多行打破长函数名称?

我们的开发团队使用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)

或者我必须自己咬紧牙关并缩短它?

python

77
推荐指数
7
解决办法
9930
查看次数

如何获取元素的所有CSS样式?

如果我喜欢网站的一个元素,并且我想将它实现到我的网站中,那么最简单的方法是什么?有时会有很多CSS文件,很难跟踪所有这些文件.

html css

30
推荐指数
4
解决办法
3万
查看次数

为什么“useState”钩子在是函数引用时调用初始状态?

React 有一个名为useState的钩子,它在向功能组件添加状态时使用。

挂钩API参考状态:

使用状态

const [state, setState] = useState(initialState);
Run Code Online (Sandbox Code Playgroud)

返回一个有状态的值和一个更新它的函数。

在初始渲染期间,返回的状态 ( 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)

javascript reactjs react-hooks

10
推荐指数
1
解决办法
4325
查看次数

如何注释类型实例(而不是类实例)?

注释需要类对象而不是该类实例的函数参数的正确方法是什么?

在下面的例子中,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_classFoo,BarFaz类,而不是它的一个实例.它们在类树中的位置无关紧要,因为它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等等. …

python annotations type-hinting

9
推荐指数
1
解决办法
2340
查看次数

如何使用Spread Operator将Array <Int>传递给vararg Int函数?

我有一个需要多个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 …

arrays kotlin groovy-spread

7
推荐指数
1
解决办法
626
查看次数

if语句中的if else if子句类似于C/C++

在c语言中我有类似的东西:

if(cond1)
{}
else if(cond2)
{}
else
{}
Run Code Online (Sandbox Code Playgroud)

这怎么可能在Prolog?

prolog

6
推荐指数
2
解决办法
1万
查看次数

jol在Java9下有点破碎吗?

使用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: …

java jol java-9

6
推荐指数
1
解决办法
363
查看次数

这个设计模式有名字吗?(具有仅调用构造函数的实现的基类)

编辑:我意识到这种模式感觉很像currying,这是一种功能程序员在调用之前用来指定函数参数的技术.这里的区别在于我们在对象上讨论构造函数而不是简单地使用函数.


在整个几个项目中,我发现自己使用了这个奇怪的设计模式,我找不到它的名字.它有名字吗?也许这只是不好的做法,你告诉我.

设计模式

有了这种模式,你会......

  1. 没有抽象方法的抽象基类(我们稍后可以讨论).
  2. 基类的许多"实现".但是,这些实现仅用于调用基类的构造函数.

Java示例(假设场景)

我将定义一个假设的场景来提供一些上下文.

场景:

Bob正在编写一个用于扫描源代码的小API.他希望能够检查注释是否在源代码中的给定索引处开始/结束.

这是鲍勃的代码.

1.抽象基类

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的两个实现......

2.一些实施

一个用于Java中的多行注释: …

java oop inheritance design-patterns nomenclature

5
推荐指数
1
解决办法
172
查看次数

可以以"静态"方式调用扩展函数吗?

是否可以创建一个扩展函数并将其称为静态

例如...

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的实例传递给编译器将生成的方法; 因此它不会编译.

我为什么要这个?

有些人可能想知道为什么这种行为是可取的.我能理解为什么你会认为不是,所以这里有一些原因:

  1. 它具有标准扩展功能带来的所有好处.
  2. 不需要 仅为访问额外功能而创建类的实例.
  3. 可以从系统范围的上下文访问这些函数(前提是该类是可见的).

总结一下......

Kotlin有办法将静态函数"挂钩"到类中吗?我很想知道.

kotlin extension-function

5
推荐指数
1
解决办法
965
查看次数

Jollyday API - 如何从 URL 创建 HolidayManager 实例?

快速介绍:
对于那些不知道的人;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 中看到的)所有重载变体的屏幕截图。

显示所有 HolidayManager.getInstance 方法变体的 intelliJ 屏幕截图

该文档似乎不正确。

更多信息

“您使用的 API 版本正确吗?”

是的,我使用的是0.5.1 版本,是通过 gradle 下载的。这与文档中使用的版本相同。

问题

是否可以使用 URL 创建 HolidayManager 实例?
如果是这样,是如何做到的?

java

4
推荐指数
1
解决办法
2733
查看次数