如果您想了解为什么Python没有多行注释?的相关知识,那么本文是一篇不可错过的文章,我们将为您提供关于Java-Comparator类比较方法的定义为什么是UextendsComparable?为什
如果您想了解为什么 Python 没有多行注释?的相关知识,那么本文是一篇不可错过的文章,我们将为您提供关于Java - Comparator 类比较方法的定义 为什么是U extends Comparable super U>?为什么 Function 需要 ? super T?为什么 Function 返回 ? extends U?、ObjC中,与alloc语义相反的方法是dealloc还是release?与retain语义相反的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?、Python 3.5:“与...同步”会导致SyntaxError。为什么?[重复]、Python eval(compile(…),sandbox),除非在def中,否则全局变量会进入sandbox,为什么?的有价值的信息。
本文目录一览:- 为什么 Python 没有多行注释?
- Java - Comparator 类比较方法的定义 为什么是U extends Comparable super U>?为什么 Function 需要 ? super T?为什么 Function 返回 ? extends U?
- ObjC中,与alloc语义相反的方法是dealloc还是release?与retain语义相反的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?
- Python 3.5:“与...同步”会导致SyntaxError。为什么?[重复]
- Python eval(compile(…),sandbox),除非在def中,否则全局变量会进入sandbox,为什么?
为什么 Python 没有多行注释?
好的,我知道三引号字符串可以用作多行注释。例如,
"""Hello, I am a multiline comment"""
和
''''''Hello, I am a multiline comment''''''
但从技术上讲,这些是字符串,对吗?
我已经用谷歌搜索并阅读了 Python 样式指南,但我无法找到关于为什么没有正式实现多行、/ /
注释类型的技术答案。我使用三引号没有问题,但我有点好奇是什么导致了这个设计决定。
答案1
小编典典我怀疑你会得到比“Guido 觉得不需要多行注释”更好的答案。
Guido
曾在推特上发表过这样的评论:
Python 提示:您可以使用多行字符串作为多行注释。除非用作文档字符串,否则它们不会生成任何代码!:-)
Java - Comparator 类比较方法的定义 为什么是U extends Comparable super U>?为什么 Function 需要 ? super T?为什么 Function 返回 ? extends U?
让我们考虑上述方法 comparing
的签名
static <T,U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor)
-
T
是被比较对象的类型,在上述情况下它是Person
-
U extends <Comparable<? super U>>
描述了用于实现实际比较的类型 - 这就是为什么这个类型必须是Comparable
- 在这种情况下它是String
-
Function<? super T,? extends U> keyExtractor
-keyExtractor
是一个函数,它将类T
(Person
) 的对象“转换”为类U
(String
) - 在这个类中,它是一个在类Person
中定义的名称的 getter。
我在这里看到了三个主要的困惑:
为什么是U extends Comparable<? super U>
?
这是对 U
(键的类型)的约束,指定 U
可以是什么特定类型。它说 U
必须具有可比性。有道理吧?尖括号中的部分指定“可以将 U
与哪些内容进行比较?”例如,Comparable<Animal>
的意思是“与动物相当”。约束表示“U
必须与 U
的某个超类型相当”。
您可能想知道为什么它不只是说“U
必须与 U
相当”,即 U extends Comparable<U>
。这是因为我们试图使我们的方法尽可能灵活,即我们尝试接受尽可能多的不同 U
。如果我有一个 Dog
可以与 Animal
进行比较(实现 Comparable<Animal>
),那么狗也可以与另一个 Dog
进行比较是合乎逻辑的。但是,由于 Dog
实现了 Comparable<Animal>
而不是 Comparable<Dog>
,它不满足 U extends Comparable<U>
,这就是我们必须使用 U extends Comparable<? extends U>
的原因。
为什么 Function
需要 ? super T
?
想象一下,我有一个密钥提取器,它接受一个 Object
,我返回它的 toString()
输出作为要比较的密钥(这是一个非常不常见的比较,但为了这个例子,忍受我:D)
Function<Object,String> stringExtractor = Object::toString;
现在我想要一个比较动物的比较器。我可以使用这个 stringExtractor
作为 comparing
的参数吗?我当然可以:
Comparator<Animal> comparator = Comparator.comparing(stringExtractor);
所有动物都有一个 toString
方法,因为它们毕竟是 Object
的子类!这就是为什么关键提取器参数采用采用 T
超类的函数的原因 - 以允许我们传递上述内容。如果是 Function<T,? extends U>
,我们将无法执行 Comparator.comparing(stringExtractor)
。
同样,我们的想法是我们希望 comparing
处理尽可能多的事情。
为什么 Function
返回 ? extends U
?
这实际上是完全没有必要的。除非您像这样明确指定 T
和 U
:
Comparator.<Foo,Animal>comparing(Foo::getDog);
无论是Function<? super T,U>
还是Function<? super T,? extends U>
都没有区别。有关详细信息,请参阅 this question。这个问题是关于 thenComparing
,它的签名是 comparing
。
ObjC中,与alloc语义相反的方法是dealloc还是release?与retain语义相反的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?
Python 3.5:“与...同步”会导致SyntaxError。为什么?[重复]
我正在使用Python 3.5,根据PEP
492,它应该可以访问该asyncwith
语法,但是在尝试使用它时却收到了SyntaxError。我究竟做错了什么?
In [14]: sys.versionOut[14]: ''3.5.2 (default, Oct 11 2016, 04:59:56) \n[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)]''In [15]: async with aiohttp.ClientSession() as session: File "<ipython-input-15-9799c5ce74cf>", line 1 async with aiohttp.ClientSession() as session: ^SyntaxError: invalid syntax
答案1
小编典典asyncwith
没有async
功能就不能使用。正如文档所说:
与async def函数一起使用async是SyntaxError。
但是此代码将起作用:
async def some_function(): async with aiohttp.ClientSession() as session: pass
或看看docs中的示例。
Python eval(compile(…),sandbox),除非在def中,否则全局变量会进入sandbox,为什么?
考虑以下:
def test(s): globals()[''a''] = ssandbox = {''test'': test}py_str = ''test("Setting A")\nglobals()["b"] = "Setting B"''eval(compile(py_str, ''<string>'', ''exec''), sandbox)''a'' in sandbox # returns False, !What I dont want!''b'' in sandbox # returns True, What I want''a'' in globals() # returns True, !What I dont want!''b'' in globals() # returns False, What I want
我什至不知道怎么问,但是我希望函数的全局作用域成为我打算在不运行eval的情况下编译函数的环境。这可能吗?
感谢您的输入
解
def test(s): globals()[''a''] = ssandbox = {}# create a new version of test() that uses the sandbox for its globalsnewtest = type(test)(test.func_code, sandbox, test.func_name, test.func_defaults, test.func_closure)# add the sandboxed version of test() to the sandboxsandbox["test"] = newtestpy_str = ''test("Setting A")\nglobals()["b"] = "Setting B"''eval(compile(py_str, ''<string>'', ''exec''), sandbox)''a'' in sandbox # returns True''b'' in sandbox # returns True''a'' in globals() # returns False''b'' in globals() # returns False
答案1
小编典典在Python中调用函数时,它看到的全局变量始终是其定义所在模块的全局变量。(如果不正确,则该函数可能无法正常工作-实际上可能 需要
一些全局值,并且您不一定要知道它们是什么。)指定带有exec
或eval()
仅影响exec
‘d或eval()
‘d看到的代码的全局变量的全局字典。
如果要让函数看到其他全局变量,则确实必须在传递给exec
或的字符串中包含函数定义eval()
。当您这样做时,函数的“模块”就是从其编译的字符串,带有其自己的全局变量(即,您提供的全局变量)。
您可以通过使用与要调用的代码对象相同的代码对象创建一个新函数来解决此问题func_globals
,但是该函数指向您的globals
dict却具有不同的属性,但这是相当先进的黑客技术,可能不值得。不过,这是您的处理方式:
# create a sandbox globals dictsandbox = {}# create a new version of test() that uses the sandbox for its globalsnewtest = type(test)(test.func_code, sandbox, test.func_name, test.func_defaults, test.func_closure)# add the sandboxed version of test() to the sandboxsandbox["test"] = newtest
我们今天的关于为什么 Python 没有多行注释?的分享就到这里,谢谢您的阅读,如果想了解更多关于Java - Comparator 类比较方法的定义 为什么是U extends Comparable super U>?为什么 Function 需要 ? super T?为什么 Function 返回 ? extends U?、ObjC中,与alloc语义相反的方法是dealloc还是release?与retain语义相反的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?、Python 3.5:“与...同步”会导致SyntaxError。为什么?[重复]、Python eval(compile(…),sandbox),除非在def中,否则全局变量会进入sandbox,为什么?的相关信息,可以在本站进行搜索。
本文标签: