Hunting snakes with a shotgun
Python is a little too forgiving
2019-06-27 07:00:00 +0000
A rather large number of people know me as “the guy who does weird things with python”. I would object to this title, but it is quite accurate. So, here are some of the things I like playing with in python. None of these are actually breaking the language, just little known facts and syntax. At some point I will share about actually breaking the language. For now, enjoy the weird things I have found over the past 6 years.
A little known feature of python is called “type hinting” (PEP 484). This is actually quite common to see in standard libraries, and has it’s own special syntax:
# Here is a regular function def meep(a, b): return a*b^2 # This function has no real reason to exsist, and is lacking any sort of documentation. # Let's add a docstring to explain what it does def meep(a, b): """ This function returns the result of a times b squared """ return a*b^2 # Ok. The docstring explains the function, but is not too helpful # what are a and b? what does this return? # For all we know, a could actually be a string (in which case, this function would return a string) # Let's fix that up with a type hint def meep(a: int, b: int): """ This function returns the result of a times b squared """ return a*b^2 # Thanks to the :int (called a type hint in case you didn't notice that yet), we now know that this function expects two ints. # Now, to finish this up with a secondary type hint to specify the return type def meep(a: int, b: int) -> int: """ This function returns the result of a times b squared """ return a*b^2 # There. Now we can clearly see that this function takes too ints, and returns one int. # If only this was a requirement in the language. So many headaches could be solved.
Now, keep in mind that this is called a type hint. The python compiler (yes.. Give me a second for that one) does not actually care if you obey the hint or not. Feel free to send incorrect data into a hinted function and see what you can break. Critical functions should both hint and check the data types being provided.
Just like type hints for functions, python has hints for variables too.
# A regular variable. Must be declared with an initial value my_state = None # my_state is None, as it has not been set, but needs to exist. # Let's assume that my_state is to be a state: class State: status = False def toggle(self): self.status != self.status # Finally, its time to set the state to something useful my_state = State() my_state.toggle() # Ok.. I hate this. Let's start by using type declarations first # Any variable can be un-initialized and just have a type. Like so: my_state: State # This works for anything is_alive: bool age: int name: str # Now, with this new knowledge, let's rewrite State class State: status: bool def toggle(self: State) -> None: self.status != self.status # And initialize my_state with slightly different syntax my_state = State(status=True)
I have not found much use for this yet. Hopefully there is something cool to use it for.
This is more common knowlage. A function can be declared in one line
# Here is an adder function def adder1(a:int, b:int) -> int: return a+b # Here is a one-line adder function adder2 = lambda a,b : a+b # State from above can be compacted further: class State: status: bool toggle = lambda self: self.status != self.status
On the trend of one-line code, We have the one-line if/else, also known as a Ternary in more sensible languages.
# Here is an if/else if 100 is 5: print("The world has ended") else: print("All is good") # Here is a smaller if/else print("The world has ended" if 100 is 5 else "All is good")
This one is interesting. Python, like Java, is compiled into bytecode. So yes, it technically is a compiled language. To see said bytecode, take a look at any
.pyc file sitting in your
Blog formatting experiments
I am still playing with post formats, and various types of content. This is more random than I usually prefer. Let me know your thoughts on the social media platform of your choosing.