1====================== 2Design and History FAQ 3====================== 4 5.. only:: html 6 7 .. contents:: 8 9 10Why does Python use indentation for grouping of statements? 11----------------------------------------------------------- 12 13Guido van Rossum believes that using indentation for grouping is extremely 14elegant and contributes a lot to the clarity of the average Python program. 15Most people learn to love this feature after a while. 16 17Since there are no begin/end brackets there cannot be a disagreement between 18grouping perceived by the parser and the human reader. Occasionally C 19programmers will encounter a fragment of code like this:: 20 21 if (x <= y) 22 x++; 23 y--; 24 z++; 25 26Only the ``x++`` statement is executed if the condition is true, but the 27indentation leads you to believe otherwise. Even experienced C programmers will 28sometimes stare at it a long time wondering why ``y`` is being decremented even 29for ``x > y``. 30 31Because there are no begin/end brackets, Python is much less prone to 32coding-style conflicts. In C there are many different ways to place the braces. 33If you're used to reading and writing code that uses one style, you will feel at 34least slightly uneasy when reading (or being required to write) another style. 35 36Many coding styles place begin/end brackets on a line by themselves. This makes 37programs considerably longer and wastes valuable screen space, making it harder 38to get a good overview of a program. Ideally, a function should fit on one 39screen (say, 20--30 lines). 20 lines of Python can do a lot more work than 20 40lines of C. This is not solely due to the lack of begin/end brackets -- the 41lack of declarations and the high-level data types are also responsible -- but 42the indentation-based syntax certainly helps. 43 44 45Why am I getting strange results with simple arithmetic operations? 46------------------------------------------------------------------- 47 48See the next question. 49 50 51Why are floating-point calculations so inaccurate? 52-------------------------------------------------- 53 54Users are often surprised by results like this:: 55 56 >>> 1.2 - 1.0 57 0.19999999999999996 58 59and think it is a bug in Python. It's not. This has little to do with Python, 60and much more to do with how the underlying platform handles floating-point 61numbers. 62 63The :class:`float` type in CPython uses a C ``double`` for storage. A 64:class:`float` object's value is stored in binary floating-point with a fixed 65precision (typically 53 bits) and Python uses C operations, which in turn rely 66on the hardware implementation in the processor, to perform floating-point 67operations. This means that as far as floating-point operations are concerned, 68Python behaves like many popular languages including C and Java. 69 70Many numbers that can be written easily in decimal notation cannot be expressed 71exactly in binary floating-point. For example, after:: 72 73 >>> x = 1.2 74 75the value stored for ``x`` is a (very good) approximation to the decimal value 76``1.2``, but is not exactly equal to it. On a typical machine, the actual 77stored value is:: 78 79 1.0011001100110011001100110011001100110011001100110011 (binary) 80 81which is exactly:: 82 83 1.1999999999999999555910790149937383830547332763671875 (decimal) 84 85The typical precision of 53 bits provides Python floats with 15--16 86decimal digits of accuracy. 87 88For a fuller explanation, please see the :ref:`floating point arithmetic 89<tut-fp-issues>` chapter in the Python tutorial. 90 91 92Why are Python strings immutable? 93--------------------------------- 94 95There are several advantages. 96 97One is performance: knowing that a string is immutable means we can allocate 98space for it at creation time, and the storage requirements are fixed and 99unchanging. This is also one of the reasons for the distinction between tuples 100and lists. 101 102Another advantage is that strings in Python are considered as "elemental" as 103numbers. No amount of activity will change the value 8 to anything else, and in 104Python, no amount of activity will change the string "eight" to anything else. 105 106 107.. _why-self: 108 109Why must 'self' be used explicitly in method definitions and calls? 110------------------------------------------------------------------- 111 112The idea was borrowed from Modula-3. It turns out to be very useful, for a 113variety of reasons. 114 115First, it's more obvious that you are using a method or instance attribute 116instead of a local variable. Reading ``self.x`` or ``self.meth()`` makes it 117absolutely clear that an instance variable or method is used even if you don't 118know the class definition by heart. In C++, you can sort of tell by the lack of 119a local variable declaration (assuming globals are rare or easily recognizable) 120-- but in Python, there are no local variable declarations, so you'd have to 121look up the class definition to be sure. Some C++ and Java coding standards 122call for instance attributes to have an ``m_`` prefix, so this explicitness is 123still useful in those languages, too. 124 125Second, it means that no special syntax is necessary if you want to explicitly 126reference or call the method from a particular class. In C++, if you want to 127use a method from a base class which is overridden in a derived class, you have 128to use the ``::`` operator -- in Python you can write 129``baseclass.methodname(self, <argument list>)``. This is particularly useful 130for :meth:`__init__` methods, and in general in cases where a derived class 131method wants to extend the base class method of the same name and thus has to 132call the base class method somehow. 133 134Finally, for instance variables it solves a syntactic problem with assignment: 135since local variables in Python are (by definition!) those variables to which a 136value is assigned in a function body (and that aren't explicitly declared 137global), there has to be some way to tell the interpreter that an assignment was 138meant to assign to an instance variable instead of to a local variable, and it 139should preferably be syntactic (for efficiency reasons). C++ does this through 140declarations, but Python doesn't have declarations and it would be a pity having 141to introduce them just for this purpose. Using the explicit ``self.var`` solves 142this nicely. Similarly, for using instance variables, having to write 143``self.var`` means that references to unqualified names inside a method don't 144have to search the instance's directories. To put it another way, local 145variables and instance variables live in two different namespaces, and you need 146to tell Python which namespace to use. 147 148 149.. _why-can-t-i-use-an-assignment-in-an-expression: 150 151Why can't I use an assignment in an expression? 152----------------------------------------------- 153 154Starting in Python 3.8, you can! 155 156Assignment expressions using the walrus operator `:=` assign a variable in an 157expression:: 158 159 while chunk := fp.read(200): 160 print(chunk) 161 162See :pep:`572` for more information. 163 164 165 166Why does Python use methods for some functionality (e.g. list.index()) but functions for other (e.g. len(list))? 167---------------------------------------------------------------------------------------------------------------- 168 169As Guido said: 170 171 (a) For some operations, prefix notation just reads better than 172 postfix -- prefix (and infix!) operations have a long tradition in 173 mathematics which likes notations where the visuals help the 174 mathematician thinking about a problem. Compare the easy with which we 175 rewrite a formula like x*(a+b) into x*a + x*b to the clumsiness of 176 doing the same thing using a raw OO notation. 177 178 (b) When I read code that says len(x) I *know* that it is asking for 179 the length of something. This tells me two things: the result is an 180 integer, and the argument is some kind of container. To the contrary, 181 when I read x.len(), I have to already know that x is some kind of 182 container implementing an interface or inheriting from a class that 183 has a standard len(). Witness the confusion we occasionally have when 184 a class that is not implementing a mapping has a get() or keys() 185 method, or something that isn't a file has a write() method. 186 187 -- https://mail.python.org/pipermail/python-3000/2006-November/004643.html 188 189 190Why is join() a string method instead of a list or tuple method? 191---------------------------------------------------------------- 192 193Strings became much more like other standard types starting in Python 1.6, when 194methods were added which give the same functionality that has always been 195available using the functions of the string module. Most of these new methods 196have been widely accepted, but the one which appears to make some programmers 197feel uncomfortable is:: 198 199 ", ".join(['1', '2', '4', '8', '16']) 200 201which gives the result:: 202 203 "1, 2, 4, 8, 16" 204 205There are two common arguments against this usage. 206 207The first runs along the lines of: "It looks really ugly using a method of a 208string literal (string constant)", to which the answer is that it might, but a 209string literal is just a fixed value. If the methods are to be allowed on names 210bound to strings there is no logical reason to make them unavailable on 211literals. 212 213The second objection is typically cast as: "I am really telling a sequence to 214join its members together with a string constant". Sadly, you aren't. For some 215reason there seems to be much less difficulty with having :meth:`~str.split` as 216a string method, since in that case it is easy to see that :: 217 218 "1, 2, 4, 8, 16".split(", ") 219 220is an instruction to a string literal to return the substrings delimited by the 221given separator (or, by default, arbitrary runs of white space). 222 223:meth:`~str.join` is a string method because in using it you are telling the 224separator string to iterate over a sequence of strings and insert itself between 225adjacent elements. This method can be used with any argument which obeys the 226rules for sequence objects, including any new classes you might define yourself. 227Similar methods exist for bytes and bytearray objects. 228 229 230How fast are exceptions? 231------------------------ 232 233A try/except block is extremely efficient if no exceptions are raised. Actually 234catching an exception is expensive. In versions of Python prior to 2.0 it was 235common to use this idiom:: 236 237 try: 238 value = mydict[key] 239 except KeyError: 240 mydict[key] = getvalue(key) 241 value = mydict[key] 242 243This only made sense when you expected the dict to have the key almost all the 244time. If that wasn't the case, you coded it like this:: 245 246 if key in mydict: 247 value = mydict[key] 248 else: 249 value = mydict[key] = getvalue(key) 250 251For this specific case, you could also use ``value = dict.setdefault(key, 252getvalue(key))``, but only if the ``getvalue()`` call is cheap enough because it 253is evaluated in all cases. 254 255 256Why isn't there a switch or case statement in Python? 257----------------------------------------------------- 258 259You can do this easily enough with a sequence of ``if... elif... elif... else``. 260There have been some proposals for switch statement syntax, but there is no 261consensus (yet) on whether and how to do range tests. See :pep:`275` for 262complete details and the current status. 263 264For cases where you need to choose from a very large number of possibilities, 265you can create a dictionary mapping case values to functions to call. For 266example:: 267 268 def function_1(...): 269 ... 270 271 functions = {'a': function_1, 272 'b': function_2, 273 'c': self.method_1, ...} 274 275 func = functions[value] 276 func() 277 278For calling methods on objects, you can simplify yet further by using the 279:func:`getattr` built-in to retrieve methods with a particular name:: 280 281 def visit_a(self, ...): 282 ... 283 ... 284 285 def dispatch(self, value): 286 method_name = 'visit_' + str(value) 287 method = getattr(self, method_name) 288 method() 289 290It's suggested that you use a prefix for the method names, such as ``visit_`` in 291this example. Without such a prefix, if values are coming from an untrusted 292source, an attacker would be able to call any method on your object. 293 294 295Can't you emulate threads in the interpreter instead of relying on an OS-specific thread implementation? 296-------------------------------------------------------------------------------------------------------- 297 298Answer 1: Unfortunately, the interpreter pushes at least one C stack frame for 299each Python stack frame. Also, extensions can call back into Python at almost 300random moments. Therefore, a complete threads implementation requires thread 301support for C. 302 303Answer 2: Fortunately, there is `Stackless Python <https://github.com/stackless-dev/stackless/wiki>`_, 304which has a completely redesigned interpreter loop that avoids the C stack. 305 306 307Why can't lambda expressions contain statements? 308------------------------------------------------ 309 310Python lambda expressions cannot contain statements because Python's syntactic 311framework can't handle statements nested inside expressions. However, in 312Python, this is not a serious problem. Unlike lambda forms in other languages, 313where they add functionality, Python lambdas are only a shorthand notation if 314you're too lazy to define a function. 315 316Functions are already first class objects in Python, and can be declared in a 317local scope. Therefore the only advantage of using a lambda instead of a 318locally-defined function is that you don't need to invent a name for the 319function -- but that's just a local variable to which the function object (which 320is exactly the same type of object that a lambda expression yields) is assigned! 321 322 323Can Python be compiled to machine code, C or some other language? 324----------------------------------------------------------------- 325 326`Cython <http://cython.org/>`_ compiles a modified version of Python with 327optional annotations into C extensions. `Nuitka <http://www.nuitka.net/>`_ is 328an up-and-coming compiler of Python into C++ code, aiming to support the full 329Python language. For compiling to Java you can consider 330`VOC <https://voc.readthedocs.io>`_. 331 332 333How does Python manage memory? 334------------------------------ 335 336The details of Python memory management depend on the implementation. The 337standard implementation of Python, :term:`CPython`, uses reference counting to 338detect inaccessible objects, and another mechanism to collect reference cycles, 339periodically executing a cycle detection algorithm which looks for inaccessible 340cycles and deletes the objects involved. The :mod:`gc` module provides functions 341to perform a garbage collection, obtain debugging statistics, and tune the 342collector's parameters. 343 344Other implementations (such as `Jython <http://www.jython.org>`_ or 345`PyPy <http://www.pypy.org>`_), however, can rely on a different mechanism 346such as a full-blown garbage collector. This difference can cause some 347subtle porting problems if your Python code depends on the behavior of the 348reference counting implementation. 349 350In some Python implementations, the following code (which is fine in CPython) 351will probably run out of file descriptors:: 352 353 for file in very_long_list_of_files: 354 f = open(file) 355 c = f.read(1) 356 357Indeed, using CPython's reference counting and destructor scheme, each new 358assignment to *f* closes the previous file. With a traditional GC, however, 359those file objects will only get collected (and closed) at varying and possibly 360long intervals. 361 362If you want to write code that will work with any Python implementation, 363you should explicitly close the file or use the :keyword:`with` statement; 364this will work regardless of memory management scheme:: 365 366 for file in very_long_list_of_files: 367 with open(file) as f: 368 c = f.read(1) 369 370 371Why doesn't CPython use a more traditional garbage collection scheme? 372--------------------------------------------------------------------- 373 374For one thing, this is not a C standard feature and hence it's not portable. 375(Yes, we know about the Boehm GC library. It has bits of assembler code for 376*most* common platforms, not for all of them, and although it is mostly 377transparent, it isn't completely transparent; patches are required to get 378Python to work with it.) 379 380Traditional GC also becomes a problem when Python is embedded into other 381applications. While in a standalone Python it's fine to replace the standard 382malloc() and free() with versions provided by the GC library, an application 383embedding Python may want to have its *own* substitute for malloc() and free(), 384and may not want Python's. Right now, CPython works with anything that 385implements malloc() and free() properly. 386 387 388Why isn't all memory freed when CPython exits? 389---------------------------------------------- 390 391Objects referenced from the global namespaces of Python modules are not always 392deallocated when Python exits. This may happen if there are circular 393references. There are also certain bits of memory that are allocated by the C 394library that are impossible to free (e.g. a tool like Purify will complain about 395these). Python is, however, aggressive about cleaning up memory on exit and 396does try to destroy every single object. 397 398If you want to force Python to delete certain things on deallocation use the 399:mod:`atexit` module to run a function that will force those deletions. 400 401 402Why are there separate tuple and list data types? 403------------------------------------------------- 404 405Lists and tuples, while similar in many respects, are generally used in 406fundamentally different ways. Tuples can be thought of as being similar to 407Pascal records or C structs; they're small collections of related data which may 408be of different types which are operated on as a group. For example, a 409Cartesian coordinate is appropriately represented as a tuple of two or three 410numbers. 411 412Lists, on the other hand, are more like arrays in other languages. They tend to 413hold a varying number of objects all of which have the same type and which are 414operated on one-by-one. For example, ``os.listdir('.')`` returns a list of 415strings representing the files in the current directory. Functions which 416operate on this output would generally not break if you added another file or 417two to the directory. 418 419Tuples are immutable, meaning that once a tuple has been created, you can't 420replace any of its elements with a new value. Lists are mutable, meaning that 421you can always change a list's elements. Only immutable elements can be used as 422dictionary keys, and hence only tuples and not lists can be used as keys. 423 424 425How are lists implemented in CPython? 426------------------------------------- 427 428CPython's lists are really variable-length arrays, not Lisp-style linked lists. 429The implementation uses a contiguous array of references to other objects, and 430keeps a pointer to this array and the array's length in a list head structure. 431 432This makes indexing a list ``a[i]`` an operation whose cost is independent of 433the size of the list or the value of the index. 434 435When items are appended or inserted, the array of references is resized. Some 436cleverness is applied to improve the performance of appending items repeatedly; 437when the array must be grown, some extra space is allocated so the next few 438times don't require an actual resize. 439 440 441How are dictionaries implemented in CPython? 442-------------------------------------------- 443 444CPython's dictionaries are implemented as resizable hash tables. Compared to 445B-trees, this gives better performance for lookup (the most common operation by 446far) under most circumstances, and the implementation is simpler. 447 448Dictionaries work by computing a hash code for each key stored in the dictionary 449using the :func:`hash` built-in function. The hash code varies widely depending 450on the key and a per-process seed; for example, "Python" could hash to 451-539294296 while "python", a string that differs by a single bit, could hash 452to 1142331976. The hash code is then used to calculate a location in an 453internal array where the value will be stored. Assuming that you're storing 454keys that all have different hash values, this means that dictionaries take 455constant time -- O(1), in Big-O notation -- to retrieve a key. 456 457 458Why must dictionary keys be immutable? 459-------------------------------------- 460 461The hash table implementation of dictionaries uses a hash value calculated from 462the key value to find the key. If the key were a mutable object, its value 463could change, and thus its hash could also change. But since whoever changes 464the key object can't tell that it was being used as a dictionary key, it can't 465move the entry around in the dictionary. Then, when you try to look up the same 466object in the dictionary it won't be found because its hash value is different. 467If you tried to look up the old value it wouldn't be found either, because the 468value of the object found in that hash bin would be different. 469 470If you want a dictionary indexed with a list, simply convert the list to a tuple 471first; the function ``tuple(L)`` creates a tuple with the same entries as the 472list ``L``. Tuples are immutable and can therefore be used as dictionary keys. 473 474Some unacceptable solutions that have been proposed: 475 476- Hash lists by their address (object ID). This doesn't work because if you 477 construct a new list with the same value it won't be found; e.g.:: 478 479 mydict = {[1, 2]: '12'} 480 print(mydict[[1, 2]]) 481 482 would raise a :exc:`KeyError` exception because the id of the ``[1, 2]`` used in the 483 second line differs from that in the first line. In other words, dictionary 484 keys should be compared using ``==``, not using :keyword:`is`. 485 486- Make a copy when using a list as a key. This doesn't work because the list, 487 being a mutable object, could contain a reference to itself, and then the 488 copying code would run into an infinite loop. 489 490- Allow lists as keys but tell the user not to modify them. This would allow a 491 class of hard-to-track bugs in programs when you forgot or modified a list by 492 accident. It also invalidates an important invariant of dictionaries: every 493 value in ``d.keys()`` is usable as a key of the dictionary. 494 495- Mark lists as read-only once they are used as a dictionary key. The problem 496 is that it's not just the top-level object that could change its value; you 497 could use a tuple containing a list as a key. Entering anything as a key into 498 a dictionary would require marking all objects reachable from there as 499 read-only -- and again, self-referential objects could cause an infinite loop. 500 501There is a trick to get around this if you need to, but use it at your own risk: 502You can wrap a mutable structure inside a class instance which has both a 503:meth:`__eq__` and a :meth:`__hash__` method. You must then make sure that the 504hash value for all such wrapper objects that reside in a dictionary (or other 505hash based structure), remain fixed while the object is in the dictionary (or 506other structure). :: 507 508 class ListWrapper: 509 def __init__(self, the_list): 510 self.the_list = the_list 511 512 def __eq__(self, other): 513 return self.the_list == other.the_list 514 515 def __hash__(self): 516 l = self.the_list 517 result = 98767 - len(l)*555 518 for i, el in enumerate(l): 519 try: 520 result = result + (hash(el) % 9999999) * 1001 + i 521 except Exception: 522 result = (result % 7777777) + i * 333 523 return result 524 525Note that the hash computation is complicated by the possibility that some 526members of the list may be unhashable and also by the possibility of arithmetic 527overflow. 528 529Furthermore it must always be the case that if ``o1 == o2`` (ie ``o1.__eq__(o2) 530is True``) then ``hash(o1) == hash(o2)`` (ie, ``o1.__hash__() == o2.__hash__()``), 531regardless of whether the object is in a dictionary or not. If you fail to meet 532these restrictions dictionaries and other hash based structures will misbehave. 533 534In the case of ListWrapper, whenever the wrapper object is in a dictionary the 535wrapped list must not change to avoid anomalies. Don't do this unless you are 536prepared to think hard about the requirements and the consequences of not 537meeting them correctly. Consider yourself warned. 538 539 540Why doesn't list.sort() return the sorted list? 541----------------------------------------------- 542 543In situations where performance matters, making a copy of the list just to sort 544it would be wasteful. Therefore, :meth:`list.sort` sorts the list in place. In 545order to remind you of that fact, it does not return the sorted list. This way, 546you won't be fooled into accidentally overwriting a list when you need a sorted 547copy but also need to keep the unsorted version around. 548 549If you want to return a new list, use the built-in :func:`sorted` function 550instead. This function creates a new list from a provided iterable, sorts 551it and returns it. For example, here's how to iterate over the keys of a 552dictionary in sorted order:: 553 554 for key in sorted(mydict): 555 ... # do whatever with mydict[key]... 556 557 558How do you specify and enforce an interface spec in Python? 559----------------------------------------------------------- 560 561An interface specification for a module as provided by languages such as C++ and 562Java describes the prototypes for the methods and functions of the module. Many 563feel that compile-time enforcement of interface specifications helps in the 564construction of large programs. 565 566Python 2.6 adds an :mod:`abc` module that lets you define Abstract Base Classes 567(ABCs). You can then use :func:`isinstance` and :func:`issubclass` to check 568whether an instance or a class implements a particular ABC. The 569:mod:`collections.abc` module defines a set of useful ABCs such as 570:class:`~collections.abc.Iterable`, :class:`~collections.abc.Container`, and 571:class:`~collections.abc.MutableMapping`. 572 573For Python, many of the advantages of interface specifications can be obtained 574by an appropriate test discipline for components. There is also a tool, 575PyChecker, which can be used to find problems due to subclassing. 576 577A good test suite for a module can both provide a regression test and serve as a 578module interface specification and a set of examples. Many Python modules can 579be run as a script to provide a simple "self test." Even modules which use 580complex external interfaces can often be tested in isolation using trivial 581"stub" emulations of the external interface. The :mod:`doctest` and 582:mod:`unittest` modules or third-party test frameworks can be used to construct 583exhaustive test suites that exercise every line of code in a module. 584 585An appropriate testing discipline can help build large complex applications in 586Python as well as having interface specifications would. In fact, it can be 587better because an interface specification cannot test certain properties of a 588program. For example, the :meth:`append` method is expected to add new elements 589to the end of some internal list; an interface specification cannot test that 590your :meth:`append` implementation will actually do this correctly, but it's 591trivial to check this property in a test suite. 592 593Writing test suites is very helpful, and you might want to design your code with 594an eye to making it easily tested. One increasingly popular technique, 595test-directed development, calls for writing parts of the test suite first, 596before you write any of the actual code. Of course Python allows you to be 597sloppy and not write test cases at all. 598 599 600Why is there no goto? 601--------------------- 602 603You can use exceptions to provide a "structured goto" that even works across 604function calls. Many feel that exceptions can conveniently emulate all 605reasonable uses of the "go" or "goto" constructs of C, Fortran, and other 606languages. For example:: 607 608 class label(Exception): pass # declare a label 609 610 try: 611 ... 612 if condition: raise label() # goto label 613 ... 614 except label: # where to goto 615 pass 616 ... 617 618This doesn't allow you to jump into the middle of a loop, but that's usually 619considered an abuse of goto anyway. Use sparingly. 620 621 622Why can't raw strings (r-strings) end with a backslash? 623------------------------------------------------------- 624 625More precisely, they can't end with an odd number of backslashes: the unpaired 626backslash at the end escapes the closing quote character, leaving an 627unterminated string. 628 629Raw strings were designed to ease creating input for processors (chiefly regular 630expression engines) that want to do their own backslash escape processing. Such 631processors consider an unmatched trailing backslash to be an error anyway, so 632raw strings disallow that. In return, they allow you to pass on the string 633quote character by escaping it with a backslash. These rules work well when 634r-strings are used for their intended purpose. 635 636If you're trying to build Windows pathnames, note that all Windows system calls 637accept forward slashes too:: 638 639 f = open("/mydir/file.txt") # works fine! 640 641If you're trying to build a pathname for a DOS command, try e.g. one of :: 642 643 dir = r"\this\is\my\dos\dir" "\\" 644 dir = r"\this\is\my\dos\dir\ "[:-1] 645 dir = "\\this\\is\\my\\dos\\dir\\" 646 647 648Why doesn't Python have a "with" statement for attribute assignments? 649--------------------------------------------------------------------- 650 651Python has a 'with' statement that wraps the execution of a block, calling code 652on the entrance and exit from the block. Some language have a construct that 653looks like this:: 654 655 with obj: 656 a = 1 # equivalent to obj.a = 1 657 total = total + 1 # obj.total = obj.total + 1 658 659In Python, such a construct would be ambiguous. 660 661Other languages, such as Object Pascal, Delphi, and C++, use static types, so 662it's possible to know, in an unambiguous way, what member is being assigned 663to. This is the main point of static typing -- the compiler *always* knows the 664scope of every variable at compile time. 665 666Python uses dynamic types. It is impossible to know in advance which attribute 667will be referenced at runtime. Member attributes may be added or removed from 668objects on the fly. This makes it impossible to know, from a simple reading, 669what attribute is being referenced: a local one, a global one, or a member 670attribute? 671 672For instance, take the following incomplete snippet:: 673 674 def foo(a): 675 with a: 676 print(x) 677 678The snippet assumes that "a" must have a member attribute called "x". However, 679there is nothing in Python that tells the interpreter this. What should happen 680if "a" is, let us say, an integer? If there is a global variable named "x", 681will it be used inside the with block? As you see, the dynamic nature of Python 682makes such choices much harder. 683 684The primary benefit of "with" and similar language features (reduction of code 685volume) can, however, easily be achieved in Python by assignment. Instead of:: 686 687 function(args).mydict[index][index].a = 21 688 function(args).mydict[index][index].b = 42 689 function(args).mydict[index][index].c = 63 690 691write this:: 692 693 ref = function(args).mydict[index][index] 694 ref.a = 21 695 ref.b = 42 696 ref.c = 63 697 698This also has the side-effect of increasing execution speed because name 699bindings are resolved at run-time in Python, and the second version only needs 700to perform the resolution once. 701 702 703Why are colons required for the if/while/def/class statements? 704-------------------------------------------------------------- 705 706The colon is required primarily to enhance readability (one of the results of 707the experimental ABC language). Consider this:: 708 709 if a == b 710 print(a) 711 712versus :: 713 714 if a == b: 715 print(a) 716 717Notice how the second one is slightly easier to read. Notice further how a 718colon sets off the example in this FAQ answer; it's a standard usage in English. 719 720Another minor reason is that the colon makes it easier for editors with syntax 721highlighting; they can look for colons to decide when indentation needs to be 722increased instead of having to do a more elaborate parsing of the program text. 723 724 725Why does Python allow commas at the end of lists and tuples? 726------------------------------------------------------------ 727 728Python lets you add a trailing comma at the end of lists, tuples, and 729dictionaries:: 730 731 [1, 2, 3,] 732 ('a', 'b', 'c',) 733 d = { 734 "A": [1, 5], 735 "B": [6, 7], # last trailing comma is optional but good style 736 } 737 738 739There are several reasons to allow this. 740 741When you have a literal value for a list, tuple, or dictionary spread across 742multiple lines, it's easier to add more elements because you don't have to 743remember to add a comma to the previous line. The lines can also be reordered 744without creating a syntax error. 745 746Accidentally omitting the comma can lead to errors that are hard to diagnose. 747For example:: 748 749 x = [ 750 "fee", 751 "fie" 752 "foo", 753 "fum" 754 ] 755 756This list looks like it has four elements, but it actually contains three: 757"fee", "fiefoo" and "fum". Always adding the comma avoids this source of error. 758 759Allowing the trailing comma may also make programmatic code generation easier. 760