难道保证False == 0
和True == 1
,在Python(假设他们没有被用户重新分配)?例如,无论Python的版本(现有的,可能的,未来的版本)是什么,它是否以任何方式保证以下代码将始终产生相同的结果?
0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero'
Run Code Online (Sandbox Code Playgroud)
任何对官方文档的引用都将非常感谢!
编辑:正如许多答案所述,bool
继承自int
.因此,问题可以改写为:"文档是否正式表明程序员可以依赖于从整数继承的布尔值,以及值0
和1
?".这个问题与编写由于实现细节而不会失败的健壮代码有关!
在C/C#/等中,你可以告诉编译器一个字面数字不是它看起来的样子(即float
代替double
,unsigned long
而不是int
:
var d = 1.0; // double
var f = 1.0f; // float
var u = 1UL; // unsigned long
Run Code Online (Sandbox Code Playgroud)
等等
有人能指出我这些的清单吗?我特意为short
或寻找后缀Int16
.
你可以添加新的语句(例如print
,raise
,with
)Python的语法?
说,允许..
mystatement "Something"
Run Code Online (Sandbox Code Playgroud)
要么,
new_if True:
print "example"
Run Code Online (Sandbox Code Playgroud)
如果你应该,而不是如果它是可能的(没有修改python解释器代码)
我知道在哪里可以找到C#5语言规范,但我无法在任何地方找到C#6语言规范.
C#6语言规范在哪里?
在C#语言规范描述键入第7.5.2节推断.其中有一个我不明白的细节.考虑以下情况:
// declaration
void Method<T>(T obj, Func<string, T> func);
// call
Method("obj", s => (object) s);
Run Code Online (Sandbox Code Playgroud)
Microsoft和Mono C#编译器都正确推断T
= object
,但我对规范中算法的理解会产生T
= string
然后失败.以下是我的理解:
第一阶段
如果Ei是匿名函数,则从Ei到Ti 进行显式参数类型推断(第7.5.2.7节)
⇒没有效果,因为lambda表达式没有明确的参数类型.对?
否则,如果Ei具有类型U并且xi是值参数,则从U到Ti进行下限推断.
⇒第一个参数是静态类型string
,所以这会增加string
下限T
,对吧?
第二阶段
所有不固定的类型变量Xi不依赖于(§7.5.2.5)任何Xj是固定的(§7.5.2.10).
⇒ T
是不固定的; T
不依赖于任何东西......所以T
应该修复,对吗?
§7.5.2.11修复
候选类型Uj的集合开始于Xi的边界集合中的所有类型的集合.
⇒{ string
(下界)}
然后我们依次检查Xi的每个边界:[...]对于Xi的每个下界U,从候选集中移除没有从U隐式转换的所有类型Uj.[...]
⇒不会从候选集中删除任何内容,对吗?
如果在剩余的候选类型Uj中存在唯一的类型V,其中存在对所有其他候选类型的隐式转换,则Xi被固定为V.
⇒因为只有一种候选类型,所以这是真实的,所以Xi固定为string
.对?
那我哪里错了?
这两者有什么区别:
use Exception;
use \Exception;
Run Code Online (Sandbox Code Playgroud)
或那些:
use Foo\Bar;
use \Foo\Bar;
Run Code Online (Sandbox Code Playgroud)
该手册说:
请注意,对于名称空间名称(包含名称空间分隔符的完全限定名称空间名称,例如Foo\Bar而不是全局名称,例如FooBar),前导反斜杠是不必要的,不允许,因为导入名称必须是完全限定的,并且不会相对于当前名称空间进行处理.
但我并不是真的理解这一点,因为所有上述变种都有效,即它绝对不是"不允许".
看看zend_do_use
显示,is_global
(设置,当有前导反斜杠时)仅用于以下情况中的警告:
namespace {
use Exception;
}
Run Code Online (Sandbox Code Playgroud)
这告诉我:"具有非复合名称的'使用声明'异常'无效".(虽然做同样的事情use \Exception
会产生很小的影响,但不会发出警告.)
那么:我错过了什么吗?实际上有什么区别吗?
C#5.0自2012年8月开始推出.我在哪里可以找到规格?他们已经停止了ECMA规范,但MSDN怎么样?
这里的讨论提示
是否应将等效代码的行为视为定义的一部分,或者实现是否可以以非短路方式实现它们?
以下是cpython/Lib/test/test_builtin.py的相关摘录
def test_all(self):
self.assertEqual(all([2, 4, 6]), True)
self.assertEqual(all([2, None, 6]), False)
self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
self.assertRaises(RuntimeError, all, TestFailingIter())
self.assertRaises(TypeError, all, 10) # Non-iterable
self.assertRaises(TypeError, all) # No args
self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
self.assertEqual(all([]), True) # Empty iterator
S = [50, 60]
self.assertEqual(all(x > 42 for x in S), True)
S = [50, 40, 60]
self.assertEqual(all(x > 42 for x in S), False)
def test_any(self): …
Run Code Online (Sandbox Code Playgroud) Examine the following code snippets:
int a=20;
int b=30;
byte c= (a>b)? 20:30;
Run Code Online (Sandbox Code Playgroud)
Error:
incompatible types: possible lossy conversion from int to byte
byte c= (a>b)? 20:30;
Run Code Online (Sandbox Code Playgroud)
int a=20;
int b=30;
byte h1=70;
byte c= (a>b)? 20:h1;
Run Code Online (Sandbox Code Playgroud)
int a=20;
int b=30;
byte h1=70;
byte h2=89;
byte c= (a>b)? h1:h2;
Run Code Online (Sandbox Code Playgroud)
byte c= (true)? 20:30;
Run Code Online (Sandbox Code Playgroud)
All of these compile fine except for Snippet #1. How is this behavior justified? If Snippet #1 produces the …
我想知道为什么我不能在非泛型类中拥有泛型属性,就像我可以使用泛型方法一样.即:
public interface TestClass
{
IEnumerable<T> GetAllBy<T>(); //this works
IEnumerable<T> All<T> { get; } //this does not work
}
Run Code Online (Sandbox Code Playgroud)
我读了@Jon Skeet的回答,但这只是一个声明,很可能是规范中的某个地方.
我的问题是为什么它实际上是这样的?这种限制是否避免了一些问题?