Hints and Tips and How-Tos


Formatting with the print statement

use f strings to limit number of decimal places:
    print('power to heat tank ',kWh, 'kWh')
         power to heat tank 9.333333333333 kWh
    print(f'power to heat tank {kWh:.2f}', 'kWh')
         power to heat tank 9.33 kWh

use f strings to pad numbers:
   print(
         f'{diff_days:6}',
         f'{diff_dunits:6}',
         f'{diff_dunits/diff_days:3.2f}'
         )                                
364  10301 28.29

use f strings to print in hex:
print(f'{128:x}')                
80

use f strings with \n for new lines:
print(f' hello \n world')                
 hello
 world

use the print 'sep' arg to remove leading space after a newline

print('hello','\nl','world')
hello
 world

print('hello','world',sep='\n')
hello
world



Miscellaneous


1.1  use Del to backspace delete

1.2  !LineEdit is a "must have" for using the command line shell

1.3  Enter to quit help() mode or "q" if part way through show

1.4  comments start with hash # and continue to end of line

1.5  use 4 spaces per indentation level

1.6  Limit all lines to a maximum of 79 characters.
     - use backslash or preferably parentheses 
     eg.
     xxxxx = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13
     xxxxx = (1 + 2 + 3 + 4
              + 5 +6 + 7 
              + 8 + 9 + 10
              + 11 + 12 + 13)
     print('hello \
     world')
     
     # multiline literal
     print('''
     If you answer "yes" to the prompt, python will die!
     and you will need to reboot RISC OS to resurrect it
     ''')

1,7  Use CamelCase for classes and
     snakecase - lower_case_with_underscores
     for functions and methods

1.8  "Dunder names" eg, __all__
     (Dunder is Double Underscore)

1.9  module sys defines  prompts, path, etc
     >>>sys.ps1 = '--> '
     -->
     --> print(sys.platform)
     --> riscos

1.A  To recall last expression output  use underscore  _
     eg
     >>>2+2
     4
     >>>_+2
     6
     >>>

2.1  Allow StrongED to copy and paste into a TaskWindow
     load the TaskWindow ModeFile
     change:
       cs-V  ToTask
     to:
       cs-V  ReleaseShiftCtrl CB_Paste

     change:
       cs-C  ToTask
     to:
       cs-V  ReleaseShiftCtrl CB_Copy

2.2  StrongED search direcyory
     ctrl-E,ctrl-D


4.1  print output goes to standard out
      sys.stdout (2)
     error output goes to standard error
      sys.stderr (1)
     eg python3 mypgm.py 1>a 2>b
     eg Dir 
        python3 .!RunImage 1>^.stdout
        (puts output in same dir as app)



5.0 Functions

5.1 how to define a function - def function_name(parameters): """docstring""" statement(s) 5.2 Trigonometric functions import math opp = 65 adj = 216 rad = math.atan2(opp,adj) deg = math.degrees(rad) print(rad, deg) 5.3 Date functions >>>from datetime import date >>>pr = date.today() ; print(pr) 2021-07-30 >>>from datetime import datetime >>>print(datetime.now()) 2021-07-30 18:10:18.590000 >>>from datetime import datetime >>>date1 = datetime.strptime('24 09 40','%d %m %y' ) >>>date2 = datetime.strptime('24.09.42','%d.%m.%y' ) >>>print(date1, date2) 2040-09-24 00:00:00

6.0 More syntax

6.1 A String cannot be changed via indexed assignment 6.2 Python has No CASE statement - if if,elif instead 6.3 For with range import math adj = 216 for opp in range(12,90,12): rad = math.atan2(opp,adj) deg = math.degrees(rad) print(opp, deg) 6.4 To get a row number with open(csvfile, newline='') as f: reader = csv.DictReader(f) for r, row in enumerate(reader): print (r, row['days'], row['dunits']) 6.5 ifs and buts if x == 0: pass elif x == 1: print('x') print('is') print('one') elif x == 2: print('x is two') else: print('x is not 1,2,or 3') 6.6 a, b = b, a swaps without needing an intermediate variable 6.7 hexadecimal - see also f strings above hex(512) '0x200' int('8A',16) 138 6.8 get response at console retry = True while retry: ans = input("unset python variables?(y/n)\n") if ans == "y" or ans == "n": retry = False

7.0 Classes

7.1 example of a class class BackDrop: """manage screen background picture""" def __init__(self): # name self is conventional self.pic = "pix.b01" class Paper: """paper for magazine""" def __init__(self): self.size = "A4" self.ream = 500 self.perbox = 5 papr = Paper() print(papr.size, papr.ream, papr.perbox) 7.2 Is Class same as Type? - see eg below rent = ( "r03",192, "r02",682) print(rent) print(type(rent)) ('r03', 192, 'r02', 682) <class 'tuple'>

8.0 Communicating with the Operating System

8.1 Use the swi module to issue system commands (From Chris Johns Python Release Notes) swi.swi(arg1,arg2,arg3) allows Python code to call RISC OS SWIs. arg1 is the SWI number or name, arg2 is a format string for arg3, arg3 is the rest of the arguments. syntax of arg2 format string of single byte positional keys corresponding to an input or output register in the swi definition s = string b = block i = integer I = Unsigned integer? . = not used ; end of inputs, outputs follow # examples of RISC OS SWI commands import swi as swi swi("OS_Write0","s","Hello RISC OS World") # this works swi("OS_WriteC","i",10) # line feed swi("OS_WriteC","i",13) # carrier return swi("OS_Byte","i",0) # Os version swi("OS_CLI","s","hoff") # hourglass off RISC OS additions ----------------- os.get_filetype(object) returns the file type of a given object. os.set_filetype(object,type) will set it. 8.2 Use os.system to issue * (star) commands # example RISC OS * - star commands import os os.system('fx 0') # Os version os.system('cat') os.system('hon') # hourglass on os.system('hoff') showparm = "*path*" pr = os.system("show "+ showparm) ; print(pr) 8.3 Environment variables # print list - same as RISC OS show * import os for k, v in os.environ.items(): print(f'{k}={v}') 8.4 Stop execution of a script part way through import sys sys.exit("execution stopped") 8.5 use dot for slash inside Python shell but use slash for dot in Python script eg import sqlite3 con = sqlite3.connect('eg/db') 8.6 to reference parent directory - use ^.filename 8.7 CWD Current Working Directory >>> import os >>> cwd=os.getcwd() >>> print(cwd) SCSI::SSD.$.JR.Programz.PYTHON.eg_test.tkinter You can change the current working directory import os os.chdir(path) .... Changing the current working directory in a subprocess does not change the current working directory in the parent process. This is true of the Python interpreter as well. You cannot use os.chdir() to change the CWD of the calling process. 8.8 find out where we are and set CSD def set_cwd_to_local_dir(): import os mypath = os.path.abspath(__file__) mydir = os.path.dirname(mypath) os.chdir(mydir) import os set_cwd_to_local_dir() print('cwd = ', os.getcwd())

9.0 BUGS

9.1 There is a bug in RISC OS 3.8.python which sometimes leads to print output appearing in the wrong order. Use the print flush method to force immediate printing sys.stdout.flush() 9.2 Marshal Error probably a corrupted "pyc" file find and delete it - it will be regenerated 9.3 When pasting code from a webpage watch out for hard spaces. Symptons: SyntaxError: Non-UTF-8 code starting with '\xa0' in file ...

© 2021 JR