You cannot split a statement into multiple lines in Python by pressing Enter . Instead, use the backslash ( \ ) to indicate that a statement is continued on the next line. In the revised version of the script, a blank space and an underscore indicate that the statement that was started on line 1 is continued on line 2.
For example, n = 50 is an assignment statement. Multi-Line Statements: Statements in Python can be extended to one or more lines using parentheses (), braces {}, square brackets [], semi-colon (;), continuation character slash (\).
In Python, a backslash ( \ ) is a line continuation character. If a backslash is placed at the end of a line, it is considered that the line is continued on the next line. Only string literals (string surrounded by ' or " ) are concatenated if written consecutively.
Unfortunately, what you want is not possible with Python (which makes Python close to useless for command-line one-liner programs). Even explicit use of parentheses does not avoid the syntax exception. You can get away with a sequence of simple statements, separated by semi-colon:
for i in range(10): print "foo"; print "bar"
But as soon as you add a construct that introduces an indented block (like if
), you need the line break. Also,
for i in range(10): print "i equals 9" if i==9 else None
is legal and might approximate what you want.
As for the try ... except
thing: It would be totally useless without the except
. try
says "I want to run this code, but it might throw an exception". If you don't care about the exception, leave away the try
. But as soon as you put it in, you're saying "I want to handle a potential exception". The pass
then says you wish to not handle it specifically. But that means your code will continue running, which it wouldn't otherwise.
You could use the built-in exec statement, eg.:
exec("try: \n \t if sam[0] != 'harry': \n \t\t print('hello', sam) \nexcept: pass")
Where \n
is a newline and \t
is used as indentation (a tab).
Also, you should count the spaces you use, so your indentation matches exactly.
However, as all the other answers already said, this is of course only to be used when you really have to put it on one line.
exec
is quite a dangerous statement (especially when building a webapp) since it allows execution of arbitrary Python code.
Yes this post is 8 years old, but incase someone comes on here also looking for an answer: you can now just use semicolons. However, you cannot use if/elif/else staments, for/while loops, and you can't define functions. The main use of this would be when using imported modules where you don't have to define any functions or use any if/elif/else/for/while statements/loops.
Here's an example that takes the artist of a song, the song name, and searches genius for the lyrics:
import bs4, requests; song = input('Input artist then song name\n'); print(bs4.BeautifulSoup(requests.get(f'https://genius.com/{song.replace(" ", "-")}-lyrics').text,'html.parser').select('.lyrics')[0].text.strip())
I do not incentivise this, but say you're on command line, you have nothing but Python and you really need a one-liner, you can do this:
python -c "$(echo -e "a='True'\nif a : print 1")"
What we're doing here is pre-processing \n
before evaluating Python code.
That's super hacky! Don't write code like this.
I recommend not doing this...
What you are describing is not a comprehension.
PEP 8 Style Guide for Python Code, which I do recommend, has this to say on compound statements:
- Compound statements (multiple statements on the same line) are generally discouraged.
Yes:
if foo == 'blah': do_blah_thing() do_one() do_two() do_three()
Rather not:
if foo == 'blah': do_blah_thing() do_one(); do_two(); do_three()
Here is a sample comprehension to make the distinction:
>>> [i for i in xrange(10) if i == 9]
[9]
For a python -c
oriented solution, and provided you use Bash shell, yes you can have a simple one-line syntax like in this example:
Suppose you would like to do something like this (very similar to your sample, including except: pass
instruction):
python -c "from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n" OUTPUT_VARIABLE __numpy_path
This will NOT work and produce this Error:
File "<string>", line 1
from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n
^
SyntaxError: unexpected character after line continuation character `
This is because the competition between Bash and Python Interpretation of \n
escape sequences. To solve the problem one can use the $'string'
Bash syntax to force \n
Bash interpretation BEFORE the Python one. To make the example more challenging I added a typical Python end=..\n..
specification in the Python print call: at the end you will be able to get BOTH \n
interpretations from bash and Python working together, each on its piece of text of concern. So that finally the proper solution is like this :
python -c $'from __future__ import print_function\ntry:\n import numpy;\n print( numpy.get_include(), end="\\n" )\n print( "Hello" )\nexcept:pass\n' OUTPUT_VARIABLE __numpy_path
That leads to the proper clean output with no error:
/Softs/anaconda/lib/python3.7/site-packages/numpy/core/include
Hello
Note: this should work as well with exec
oriented solutions, because the problem is still the same (Bash and Python interpreters competition).
Note2: one could workaround the problem by replacing some \n
by some ;
but it will not work anytime (depending on Python constructs), while my solution allows to always "one-line" any piece of classic multi-line Python program.
Note3: of course, when one-lining, one has always to take care of Python spaces and indentation, because in fact we are not strictly "one-lining" here, BUT doing a proper mixed-management of \n
escape sequence between bash and Python. This is how we can deal with any piece of classic multi-line Python program. The solution sample illustrates this as well.
Its acctualy possible ;-)
# not pep8 compatible^
sam = ['Sam',]
try: print('hello',sam) if sam[0] != 'harry' else rais
except: pass
You can do very ugly stuff in python like:
def o(s):return''.join([chr(ord(n)+(13if'Z'<n<'n'or'N'>n else-13))if n.isalpha()else n for n in s])
which is function for rot13/cesa encryption in one line with 99 characters.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With