100% found this document useful (2 votes)
14 views

Advanced Guide to Python 3 Programming, 2nd 2nd Edition John Huntdownload

The document is a promotional overview of the 'Advanced Guide to Python 3 Programming, 2nd Edition' by John Hunt, highlighting its updates from Python 3.7 to 3.12 and the addition of 18 new chapters covering advanced topics. It emphasizes the book's suitability for self-study and its structured approach with exercises and examples available on GitHub. Additionally, it includes links to related Python programming resources and other recommended books.

Uploaded by

borehzianda40
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (2 votes)
14 views

Advanced Guide to Python 3 Programming, 2nd 2nd Edition John Huntdownload

The document is a promotional overview of the 'Advanced Guide to Python 3 Programming, 2nd Edition' by John Hunt, highlighting its updates from Python 3.7 to 3.12 and the addition of 18 new chapters covering advanced topics. It emphasizes the book's suitability for self-study and its structured approach with exercises and examples available on GitHub. Additionally, it includes links to related Python programming resources and other recommended books.

Uploaded by

borehzianda40
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 57

Advanced Guide to Python 3 Programming, 2nd 2nd

Edition John Hunt pdf download

https://ebookmass.com/product/advanced-guide-to-
python-3-programming-2nd-2nd-edition-john-hunt/

Explore and download more ebooks at ebookmass.com


Here are some recommended products for you. Click the link to
download, or explore more at ebookmass.com

A Beginners Guide to Python 3 Programming 2nd Edition John


Hunt

https://ebookmass.com/product/a-beginners-guide-to-
python-3-programming-2nd-edition-john-hunt/

Python Programming: 3 Books in 1: Ultimate Beginneru2019s,


Intermediate & Advanced Guide to Learn Python Step-by-Step

https://ebookmass.com/product/python-programming-3-books-
in-1-ultimate-beginners-intermediate-advanced-guide-to-learn-python-
step-by-step/

Learning Scientific Programming with Python 2nd Edition


Christian Hill

https://ebookmass.com/product/learning-scientific-programming-with-
python-2nd-edition-christian-hill-2/

Learning Scientific Programming With Python 2nd Edition


Christian Hill

https://ebookmass.com/product/learning-scientific-programming-with-
python-2nd-edition-christian-hill/
Python Mini Reference 2022: A Quick Guide to the Modern
Python Programming Language for Busy Coders (A
Hitchhiker's Guide to the Modern Programming Languages
Book 3) Harry Yoon
https://ebookmass.com/product/python-mini-reference-2022-a-quick-
guide-to-the-modern-python-programming-language-for-busy-coders-a-
hitchhikers-guide-to-the-modern-programming-languages-book-3-harry-
yoon/

Python for Beginners: Master Python Programming from


Basics to Advanced Level Tim Simon

https://ebookmass.com/product/python-for-beginners-master-python-
programming-from-basics-to-advanced-level-tim-simon/

MicroPython for the Internet of Things: A Beginner’s Guide


to Programming with Python on Microcontrollers 2nd Edition
Bell
https://ebookmass.com/product/micropython-for-the-internet-of-things-
a-beginners-guide-to-programming-with-python-on-microcontrollers-2nd-
edition-bell/

Introduction to Computation and Programming Using Python,


Third Edition John V. Guttag

https://ebookmass.com/product/introduction-to-computation-and-
programming-using-python-third-edition-john-v-guttag/

A Guide to Assessments That Work 2nd Edition John Hunsley


(Editor)

https://ebookmass.com/product/a-guide-to-assessments-that-work-2nd-
edition-john-hunsley-editor/
Undergraduate Topics in Computer Science

John Hunt

Advanced Guide
to Python 3
Programming
Second Edition
Undergraduate Topics in Computer Science

Series Editor
Ian Mackie, University of Sussex, Brighton, UK

Advisory Editors
Samson Abramsky , Department of Computer Science, University of Oxford,
Oxford, UK
Chris Hankin , Department of Computing, Imperial College London, London,
UK
Mike Hinchey , Lero – The Irish Software Research Centre, University of
Limerick, Limerick, Ireland
Dexter C. Kozen, Department of Computer Science, Cornell University, Ithaca,
NY, USA
Andrew Pitts , Department of Computer Science and Technology, University of
Cambridge, Cambridge, UK
Hanne Riis Nielson , Department of Applied Mathematics and Computer
Science, Technical University of Denmark, Kongens Lyngby, Denmark
Steven S. Skiena, Department of Computer Science, Stony Brook University,
Stony Brook, NY, USA
Iain Stewart , Department of Computer Science, Durham University, Durham,
UK
Joseph Migga Kizza, College of Engineering and Computer Science, The
University of Tennessee-Chattanooga, Chattanooga, TN, USA
‘Undergraduate Topics in Computer Science’ (UTiCS) delivers high-quality instruc-
tional content for undergraduates studying in all areas of computing and information
science. From core foundational and theoretical material to final-year topics and
applications, UTiCS books take a fresh, concise, and modern approach and are ideal
for self-study or for a one- or two-semester course. The texts are all authored by
established experts in their fields, reviewed by an international advisory board, and
contain numerous examples and problems, many of which include fully worked
solutions.
The UTiCS concept relies on high-quality, concise books in softback format, and
generally a maximum of 275–300 pages. For undergraduate textbooks that are likely
to be longer, more expository, Springer continues to offer the highly regarded Texts
in Computer Science series, to which we refer potential authors.
John Hunt

Advanced Guide to Python 3


Programming
Second Edition
John Hunt
Midmarsh Technology Ltd.
Chippenham, Wiltshire, UK

ISSN 1863-7310 ISSN 2197-1781 (electronic)


Undergraduate Topics in Computer Science
ISBN 978-3-031-40335-4 ISBN 978-3-031-40336-1 (eBook)
https://doi.org/10.1007/978-3-031-40336-1

© Springer Nature Switzerland AG 2019, 2023

This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of
the material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other physical way, and transmission or information
storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology
now known or hereafter developed.
The use of general descriptive names, registered names, trademarks, service marks, etc. in this publication
does not imply, even in the absence of a specific statement, that such names are exempt from the relevant
protective laws and regulations and therefore free for general use.
The publisher, the authors, and the editors are safe to assume that the advice and information in this book
are believed to be true and accurate at the date of publication. Neither the publisher nor the authors or
the editors give a warranty, expressed or implied, with respect to the material contained herein or for any
errors or omissions that may have been made. The publisher remains neutral with regard to jurisdictional
claims in published maps and institutional affiliations.

This Springer imprint is published by the registered company Springer Nature Switzerland AG
The registered company address is: Gewerbestrasse 11, 6330 Cham, Switzerland
For Denise, my wife, my soulmate, my best
friend.
Preface to the Second Edition

This second edition represents a significant expansion of the material in the first
edition, as well as an update of that book from Python 3.7 to 3.12.
This book includes whole new sections on advanced language features, Reactive
Programming in Python and data analysts. New chapters on working with Tkinter,
on event handling with Tkinter and a simple drawing application using Tkinter have
been added. A new chapter on performance monitoring and profiling has also been
added. A chapter on pip and conda is included at the end of the book.
In all there are 18 completely new chapters that take you far further on your Python
journey. Enjoy the book and I hope you find it useful.

Chippenham, UK John Hunt

vii
Preface to the First Edition

Some of the key aspects of this book are


1. It assumes knowledge of Python 3 and of concepts such as functions, classes,
protocols, abstract base classes, decorators, iterables and collection types (such
as list and tuple).
2. However, the book assumes very little knowledge or experience of the topics
presented.
3. The book is divided into eleven topic areas: advanced language features,
Computer Graphics, games, testing, file input/output, database access, logging,
concurrency and parallelism, Reactive Programming, network programming and
data analytics.
4. Each topic in the book has an introductory chapter followed by chapters that
delve into that topic.
5. The book includes exercises at the end of most chapters.
6. All code examples (and exercise solutions) are provided on line in a GitHub
repository.

What You Need

You can of course just read this book; however following the examples in this book
will ensure that you get as much as possible out of the content. For this you will need
a computer.
Python is a cross-platform programming language, and as such you can use Python
on a Windows PC, a Linux box, an Apple Mac, etc. So you are not tied to a particular
type of operating system; you can use whatever you have available.
However you will need to install some software on that computer. At a minimum
you will need Python. The focus of this book is Python 3 so that is the version that
is assumed for all examples and exercises. As Python is available for a wide range

ix
x Preface to the First Edition

of platforms from Windows, to Mac OS and Linux, you will need to ensure that you
download the version for your operating system.
Python can be downloaded from the main Python website which can be found at
http://www.python.org/.

You will also need some form of editor to write your programs. There are numerous
generic programming editors available for different operating systems with VIM on
Linux, Notepad++ on Windows and Sublime Text on windows and Macs being
popular choices.
However, using an Integrated Development Environment (IDE) editor such as
PyCharm, Visual Studio Code or Spyder can make writing and running your programs
much easier.
However, this book does not assume any particular editor, IDE or environment
(other than Python 3 itself).

Conventions

Throughout this book you will find a number of conventions used for text styles.
These text styles distinguish between different kinds of information. Code words,
variable and Python values, used within the main body of the text, are shown using
a Courier font. A block of Python code is set out as shown here:
Preface to the First Edition xi

def draw_koch(size, depth):


if depth > 0:
for angle in ANGLES:
draw_koch(size / 3, depth - 1)
turtle.left(angle)
else:
turtle.forward(size)
# Draw three sides of snowflake
for_in range(3):
draw_koch(SIZE_OF_SNOWFLAKE, depth)
turtle.right(120)

Note that keywords and points of interest are shown in bold font.
Any command line or user input is shown in standard font as shown below, for
example:
Hello, world
Enter your name: John
Hello John

Example Code and Sample Solutions

The examples used in this book (along with sample solutions for the exercises at the
end of most chapters) are available in a GitHub repository. GitHub provides a web
interface to Git, as well as a server environment hosting Git.
Git is a version control system typically used to manage source code files (such
as those used to create systems in programming languages such as Python but also
Java, C#, C++ and Scala). Systems such as Git are very useful for collaborative
development as they allow multiple people to work on an implementation and to
merge their work together. They also provide a useful historical view of the code
(which also allows developers to roll back changes if modifications prove to be
unsuitable).
The GitHub repository for this book can be found at:
• https://github.com/johnehunt/advancedpython3_2nd
If you already have Git installed on your computer, then you can clone (obtain a
copy of) the repository locally using:
git clone https://github.com/johnehunt/advancedpyth
on3_2nd.git
If you do not have Git, then you can obtain a zip file of the examples using
https://github.com/johnehunt/advancedpython3_2nd/arc
hive/refs/heads/main.zip
Visit https://ebookmass.com today to explore
a vast collection of ebooks across various
genres, available in popular formats like
PDF, EPUB, and MOBI, fully compatible with
all devices. Enjoy a seamless reading
experience and effortlessly download high-
quality materials in just a few simple steps.
Plus, don’t miss out on exciting offers that
let you access a wealth of knowledge at the
best prices!
xii Preface to the First Edition

You can of course install Git yourself if you wish. To do this, see https://git-scm.
com/downloads. Versions of the Git client for Mac OS, Windows and Linux/Unix
are available here.
However, many IDEs such as PyCharm come with Git support and so offer another
approach to obtaining a Git repository.
For more information on Git see http://git-scm.com/doc. This Git guide
provides a very good primer and is highly recommended.

Acknowledgement I would like to thank Phoebe Hunt for creating the pixel images used for the
Starship Meteors game in Chap. 22.
Contents

1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Useful Python Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Part I Advanced Language Features


2 Python Type Hints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Pythons Type System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 The Challenge for Python Developers . . . . . . . . . . . . . . . . . . . . . . 8
2.4 Static Typing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5 Python Type Hints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.6 Type Hint Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.7 Type Hints for Multiple Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.8 The Self Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.9 The Benefits of Type Hints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.10 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.11 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3 Class Slots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2 The Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3 Slots to the Rescue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.4 Performance Benefits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.5 Why Not Use Slots? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.6 Online Resource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4 Weak References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.2 How Garbage Collection Works: Reference Counting . . . . . . . . 23
4.3 Weak References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.4 When to Use Weak References . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

xiii
xiv Contents

4.5 The Weakref Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26


4.6 Creating Weak References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.7 Retrieving Objects from Weak References . . . . . . . . . . . . . . . . . . 28
4.8 The WeakValueDicitonary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.9 WeakKeyDictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.10 Proxy Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.11 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5 Data Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.2 A Traditional Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.3 Defining Data Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.4 Defining Additional Behaviour . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.5 The Dataclass Decorator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.6 Custom Factory for Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.7 Immutable Dataclasses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.8 Data Classes and Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.9 Post Initialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.10 Initialisation Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.11 Positional Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.12 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6 Structural Pattern Matching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.2 The Match Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.3 Matching Classes with Positional Attributes . . . . . . . . . . . . . . . . . 50
6.4 Matching Against Standard Classes . . . . . . . . . . . . . . . . . . . . . . . . 51
6.5 Online Resource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
7 Working with pprint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7.2 The pprint Data Printer Module . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7.3 Basic pprint Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
7.4 Changing the Width . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
7.5 Changing the Depth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
7.6 Managing the Indentation Level . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
7.7 Reducing Line Breaks Using Compact . . . . . . . . . . . . . . . . . . . . . 59
7.8 The pformat Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.9 The saferepr() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
7.10 Using the PrettyPrinter Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
7.11 Online Resource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
8 Shallow v Deep Copy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
8.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
8.2 Copying a List of Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
8.3 The Problem with Copying . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Contents xv

8.4 The Copy Module to the Rescue . . . . . . . . . . . . . . . . . . . . . . . . . . . 68


8.5 Using the deepcopy() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
8.6 Online Resource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
9 The __init__ Versus __new__ and __call . . . . . . . . . . . . . . . . . . . . . . . . . 71
9.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
9.2 The __new__ and __init__ Methods . . . . . . . . . . . . . . . . . . . . . . . 71
9.3 The __new__ Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
9.4 When to Use the __new__ Method . . . . . . . . . . . . . . . . . . . . . . . . . 73
9.5 Using __new__ to Create a Singleton Object . . . . . . . . . . . . . . . . 74
9.6 The __init__ Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
9.7 Can __new__ and __init__ Be Used Together? . . . . . . . . . . . . . . 76
9.8 The __call__ Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
9.9 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
10 Python Metaclasses and Meta Programming . . . . . . . . . . . . . . . . . . . . . 79
10.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
10.2 Metaprogramming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
10.3 Decorators as a Form of Metaprogramming . . . . . . . . . . . . . . . . . 81
10.4 Metaclasses for Metaprogramming . . . . . . . . . . . . . . . . . . . . . . . . 83
10.4.1 Singleton Metaclass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
10.5 Exec and Eval for Metaprogramming . . . . . . . . . . . . . . . . . . . . . . 85
10.5.1 The exec() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
10.5.2 The eval() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
10.5.3 eval Versus exec() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

Part II Computer Graphics and GUIs


11 Introduction to Computer Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
11.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
11.2 Background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
11.3 The Graphical Computer Era . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
11.4 Interactive and Non Interactive Graphics . . . . . . . . . . . . . . . . . . . . 93
11.5 Pixels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
11.6 Bit Map Versus Vector Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
11.7 Buffering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
11.8 Python and Computer Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
11.9 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
11.10 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
12 Python Turtle Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
12.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
12.2 The Turtle Graphics Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
12.2.1 The Turtle Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
12.2.2 Basic Turtle Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
12.2.3 Drawing Shapes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
12.2.4 Filling Shapes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
xvi Contents

12.3 Other Graphics Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105


12.4 3D Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
12.4.1 PyOpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
12.5 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
12.6 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
13 Computer Generated Art . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
13.1 Creating Computer Art . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
13.2 A Computer Art Generator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
13.3 Fractals in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
13.4 The Koch Snowflake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
13.5 Mandelbrot Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
13.6 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
13.7 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
14 Introduction to Matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
14.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
14.2 Matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
14.3 Plot Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
14.4 Matplotlib Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
14.4.1 Backend Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
14.4.2 The Artist Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
14.4.3 The Scripting Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
14.5 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
15 Graphing with Matplotlib Pyplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
15.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
15.2 The pyplot API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
15.3 Line Graphs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
15.3.1 Coded Format Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
15.4 Scatter Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
15.4.1 When to Use Scatter Graphs . . . . . . . . . . . . . . . . . . . . . 134
15.5 Pie Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
15.5.1 Expanding Segments . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
15.5.2 When to Use Pie Charts . . . . . . . . . . . . . . . . . . . . . . . . . 138
15.6 Bar Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
15.6.1 Horizontal Bar Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
15.6.2 Coloured Bars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
15.6.3 Stacked Bar Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
15.6.4 Grouped Bar Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
15.7 Figures and Subplots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
15.8 3D Graphs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
15.9 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Contents xvii

16 Graphical User Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151


16.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
16.2 GUIs and WIMPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
16.3 Windowing Frameworks for Python . . . . . . . . . . . . . . . . . . . . . . . . 153
16.3.1 Platform-Independent GUI Libraries . . . . . . . . . . . . . . 154
16.3.2 Platform-Specific GUI Libraries . . . . . . . . . . . . . . . . . . 154
16.4 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
17 Tkinter GUI Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
17.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
17.2 Tkinter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
17.3 Windows as Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
17.4 Key Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
17.4.1 The Tk Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
17.4.2 TK Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
17.4.3 The TopLevel Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
17.4.4 The Frame Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
17.4.5 Dialogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
17.4.6 The Canvas Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
17.5 The Class Inheritance Hierarchy . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
17.5.1 Layout Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
17.6 A Simple Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
17.7 Tkinter Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
17.7.1 Mac Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
17.7.2 Windows Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
17.8 GUI Builders for Tkinter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
17.9 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
17.10 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
18 Events in Tkinter User Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
18.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
18.2 Event Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
18.3 What is Event Handling? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
18.4 What Are Event Handlers? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
18.5 Event Binders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
18.6 Virtual Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
18.7 Event Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
18.8 What Types of Event Are There? . . . . . . . . . . . . . . . . . . . . . . . . . . 174
18.9 Binding an Event to an Event Handler . . . . . . . . . . . . . . . . . . . . . . 175
18.10 Implementing Event Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
18.11 An Interactive GUI Application . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
18.12 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
18.13 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
xviii Contents

19 PyDraw Tkinter Example Application . . . . . . . . . . . . . . . . . . . . . . . . . . 185


19.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
19.2 The PyDraw Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
19.3 The Structure of the Application . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
19.3.1 Model, View and Controller Architecture . . . . . . . . . . 188
19.3.2 PyDraw MVC Architecture . . . . . . . . . . . . . . . . . . . . . . 189
19.3.3 Additional Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
19.3.4 Object Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
19.4 The Interactions Between Objects . . . . . . . . . . . . . . . . . . . . . . . . . 191
19.4.1 The PyDrawApp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
19.5 The PyDrawView Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
19.5.1 Changing the Application Mode . . . . . . . . . . . . . . . . . . 193
19.5.2 Adding a Graphic Object . . . . . . . . . . . . . . . . . . . . . . . . 193
19.6 The Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
19.6.1 The PyDrawConstants Class . . . . . . . . . . . . . . . . . . . . . 194
19.6.2 The PyDrawView Class . . . . . . . . . . . . . . . . . . . . . . . . . 195
19.6.3 The PyDrawMenuBar Class . . . . . . . . . . . . . . . . . . . . . . 196
19.6.4 The PyDrawController Class . . . . . . . . . . . . . . . . . . . . . 196
19.6.5 The DrawingModel Class . . . . . . . . . . . . . . . . . . . . . . . . 197
19.6.6 The DrawingView Class . . . . . . . . . . . . . . . . . . . . . . . . . 198
19.6.7 The DrawingController Class . . . . . . . . . . . . . . . . . . . . . 198
19.6.8 The Figure Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
19.6.9 The Square Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
19.6.10 The Circle Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
19.6.11 The Line Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
19.6.12 The Text Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
19.7 Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
19.8 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201

Part III Computer Games


20 Introduction to Games Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
20.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
20.2 Games Frameworks and Libraries . . . . . . . . . . . . . . . . . . . . . . . . . 205
20.3 Python Games Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
20.4 Using Pygame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
20.5 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
21 Building Games with Pygame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
21.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
21.2 The Display Surface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
21.3 Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
21.3.1 Event Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
21.3.2 Event Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
21.3.3 The Event Queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Contents xix

21.4 A First pygame Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214


21.5 Further Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
21.6 A More Interactive pygame Application . . . . . . . . . . . . . . . . . . . . 219
21.7 Alternative Approach to Processing Input Devices . . . . . . . . . . . 221
21.8 pygame Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
21.9 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
22 StarshipMeteors Pygame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
22.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
22.2 Creating a Spaceship Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
22.3 The Main Game Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
22.4 The GameObject Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
22.5 Displaying the Starship . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
22.6 Moving the Spaceship . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
22.7 Adding a Meteor Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
22.8 Moving the Meteors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
22.9 Identifying a Collision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
22.10 Identifying a Win . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
22.11 Increasing the Number of Meteors . . . . . . . . . . . . . . . . . . . . . . . . . 238
22.12 Pausing the Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
22.13 Displaying the Game Over Message . . . . . . . . . . . . . . . . . . . . . . . 239
22.14 The StarshipMeteors Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
22.15 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
22.16 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244

Part IV Testing
23 Introduction to Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
23.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
23.2 Types of Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
23.3 What Should Be Tested? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
23.4 Types of Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
23.4.1 Unit Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
23.4.2 Integration Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
23.4.3 System Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
23.4.4 Installation/Upgrade Testing . . . . . . . . . . . . . . . . . . . . . 252
23.4.5 Smoke Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
23.5 Automating Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
23.6 Test-Driven Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
23.6.1 The TDD Cycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
23.6.2 Test Complexity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
23.6.3 Refactoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
23.7 Design for Testability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
23.7.1 Testability Rules of Thumb . . . . . . . . . . . . . . . . . . . . . . 255
23.8 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
23.9 Book Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
xx Contents

24 PyTest Testing Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257


24.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
24.2 What is PyTest? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
24.3 Setting up PyTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
24.4 A Simple PyTest Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
24.5 Working with PyTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
24.6 Parameterised Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
24.7 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
24.8 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
25 Mocking for Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
25.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
25.2 Why Mock? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
25.3 What is Mocking? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
25.4 Common Mocking Framework Concepts . . . . . . . . . . . . . . . . . . . 273
25.5 Mocking Frameworks for Python . . . . . . . . . . . . . . . . . . . . . . . . . . 274
25.6 The Unittest.Mock Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
25.6.1 Mock and Magic Mock Classes . . . . . . . . . . . . . . . . . . . 275
25.6.2 The Patchers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
25.6.3 Mocking Returned Objects . . . . . . . . . . . . . . . . . . . . . . . 277
25.6.4 Validating Mocks Have Been Called . . . . . . . . . . . . . . . 278
25.7 Mock and MagicMock Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
25.7.1 Naming Your Mocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
25.7.2 Mock Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
25.7.3 Attributes on Mock Classes . . . . . . . . . . . . . . . . . . . . . . 279
25.7.4 Mocking Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
25.7.5 Mocking Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
25.7.6 Raising Exceptions with Mocks . . . . . . . . . . . . . . . . . . . 281
25.7.7 Applying Patch to Every Test Method . . . . . . . . . . . . . 281
25.7.8 Using Patch as a Context Manager . . . . . . . . . . . . . . . . 281
25.8 Mock Where You Use It . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
25.9 Patch Order Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
25.10 How Many Mocks? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
25.11 Mocking Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
25.12 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
25.13 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284

Part V File Input/Output


26 Introduction to Files, Paths and IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
26.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
26.2 File Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
26.3 Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
26.4 File Input/Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Contents xxi

26.5 Sequential Access versus Random Access . . . . . . . . . . . . . . . . . . 296


26.6 Files and I/O in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
26.7 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
27 Reading and Writing Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
27.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
27.2 Obtaining References to Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
27.3 Reading Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
27.4 File Contents Iteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
27.5 Writing Data to Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
27.6 Using Files and with Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
27.7 The Fileinput Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
27.8 Renaming Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
27.9 Deleting Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
27.10 Random Access Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
27.11 Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
27.12 Temporary Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
27.13 Working with Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
27.14 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
27.15 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
28 Stream IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
28.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
28.2 What is a Stream? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
28.3 Python Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
28.4 IOBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
28.5 Raw IO/UnBuffered IO Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
28.6 Binary IO/Buffered IO Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
28.7 Text Stream Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
28.8 Stream Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
28.9 Closing Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
28.10 Returning to the Open() Function . . . . . . . . . . . . . . . . . . . . . . . . . . 322
28.11 Online Resource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
28.12 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
29 Working with CSV Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
29.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
29.2 CSV Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
29.2.1 The CSV Writer Class . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
29.2.2 The CSV Reader Class . . . . . . . . . . . . . . . . . . . . . . . . . . 327
29.2.3 The CSV DictWriter Class . . . . . . . . . . . . . . . . . . . . . . . 328
29.2.4 The CSV DictReader Class . . . . . . . . . . . . . . . . . . . . . . 329
29.3 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
29.4 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Visit https://ebookmass.com today to explore
a vast collection of ebooks across various
genres, available in popular formats like
PDF, EPUB, and MOBI, fully compatible with
all devices. Enjoy a seamless reading
experience and effortlessly download high-
quality materials in just a few simple steps.
Plus, don’t miss out on exciting offers that
let you access a wealth of knowledge at the
best prices!
Exploring the Variety of Random
Documents with Different Content
The Project Gutenberg eBook of Metsän
povessa: Tuokiokuvia 1:ssä näytöksessä
This ebook is for the use of anyone anywhere in the United States
and most other parts of the world at no cost and with almost no
restrictions whatsoever. You may copy it, give it away or re-use it
under the terms of the Project Gutenberg License included with this
ebook or online at www.gutenberg.org. If you are not located in the
United States, you will have to check the laws of the country where
you are located before using this eBook.

Title: Metsän povessa: Tuokiokuvia 1:ssä näytöksessä

Author: Raiju Ranta

Release date: June 16, 2016 [eBook #52349]

Language: Finnish

Credits: Produced by Tapio Riikonen

*** START OF THE PROJECT GUTENBERG EBOOK METSÄN


POVESSA: TUOKIOKUVIA 1:SSÄ NÄYTÖKSESSÄ ***
Produced by Tapio Riikonen

METSÄN POVESSA
Tuokiokuva 1:ssä näytöksessä

Kirj.

Raiju Ranta

Seuranäytelmä; N:o 23.

Hämeenlinnassa, Boman & Karlssonin kustannuksella 1905.


Hämeenlinnan Uusi Kirjapaino.
HENKILÖT:

Rajala, viinankeittäjä.
Rietu, hänen vaimonsa.
Leiniö, |
Pekkala, | salametsästäjiä.
Vallesmanni.
Raksi, metsänvartija.
Miehiä.

Näyttämö:

Tiheä metsä sydänmaalla. Perällä suuri kallio, siellä täällä


pienempiä kiviä.

On sunnuntai-aamu, linnut visertävät ja kaukainen kirkonkellojen


kumina kuuluu.

(Kuuluu pyssyn laukaus. Hetken perästä tulevat Leiniö ja Pekkala,


edellinen kantaen metsoa jaloista.)
Leiniö: Hitto vieköön koko tämän ammatin. Tuo ainoa räähkä
monen tunnin samoilemisesta. Ei, tämä jästi ei käytä.
Kyllästyttämäänkin alkaa tällainen turha risukosta risukkoon
juoksenteleminen. (Heittää linnun maahan ja istuu itse viereen.) En
tuumaakaan astu edemmäksi.

Pekkala (harvasanainen): Elä nyt niin pian kyllästy. Jos ei onnistu


yhdellä, niin voihan toisella kerralla olla parempi onni. Ei mitään
ilman saa tässä maailmassa. Ei niin, ei. Paistetut paistit eivät suuhun
lennä. Mennään ainakin tuonne Korpivaaran laiteelle, sieltä kenties
saamme vielä jänispaistia.

Leiniö (panee pitkälleen): Minä annan palttua Korpivaaralle ja


jäniksille. Pistä sinäkin pitkällesi, ei se sinunkaan luillesi vahingoksi
ole. — Kuules, joko ollaan Pirunkiven seutuvilla?

Pekkala: Aivan tuossahan se on Pirunkivi.

Leiniö: Hyvä juttu! Ei, mutta istu nyt sinäkin. Minua todellakaan ei
huvita enää hyppääminen. Kun vähän huilataan niin palataan kotiin.
— Pääni on niin hemmetin kipeä.

Pekkala (istuu): No, samahan tuo. — Huilataan sitte. Kohmeloko


sinun päätäsi kivistää?

Leiniö: Sinäpä sen sanoit! Kohmelo kivistää ja kovasti. Olin


Heiskasen Jaskan läksiäisissä eilen illalla ja siellähän sitä tuli otettua
vähän liikaa.

Pekkala: Osasinpa sitten hyvään tarpeeseen ottaa tuon


rohtopullon.

(Ottaa pullon povestaan.)


Leiniö: Äläs! Onko sulla viinuskaa! Heissaa vaan! Sinäpä olet mies,
sinä!

Pekkala: Jottako olen, ha, ha. No ota sitten kulahus veikkoseni,


jotta virkistyt ja jaksat jatkaa, hah, hah, haah! — Mutta mihin se
Heiskasen Jaska lähtee? Amerikaanko?

Leiniö (maistettuaan): Kiitos! Niin Amerikaanhan se menee.

Pekkala: Maista vielä vaan. — Onkohan sillä itsellään rahoja ollut?

Leiniö: Suuri kiitos. Sepä virkisti. — Mistäpä sitä rengin ruhjolle


rahoja tulisi. Sepän Eva-Stina kuuluu lähettäneen "tiketin". Näes,
Jaska vähän ruhjosti sen kanssa. Tunsit kai sinäkin Eva-Stiinan?

Pekkala (maistettuaan, panee pullon poveensa): Nilkun sepän


tyttökö?

Leiniö: Sama, sama; se jolla oli nenä pystyssä, silmät siirallaan ja


kulkiessaan heilutti häntäänsä kuin Lauttalan vasikka.

Pekkala (naurahtaen): Ha, eipä taida Jaska hänestä välittää;


sellainen komea ja rehti mies. Tiesi Evan Amerikan-matkan, niin
keplotteli vaan, päästäkseen itsekin sinne. En usko hänen
todenperään Eevaa rieputtaneen.

Leiniö: Kukapa hänen tiennee. Akat vaan niin juttelevat. (Kääntyy


kyljelleen.) Mutta kuulehan Pekkala. Minäkin olen tässä miettinyt,
että jos tuota rupeaisin akalliseksi.

Pekkala: Ole hiidessä! Mitä sinä akalla tekisit. Hyvä kun itse saat
suuhusi pantavaa, vielä sitte akalle, ha, ha!
Leiniö: Juuri senvuoksi, kun itselläni ei ole mitään, olen päättänyt
ottaa sellaisen, jolla jotain on minullekin antaa.

Pekkala: Otat jos saat. — Ketä sinä muuten meinaat, saisiko tuota
tietää?

Leiniö: No, eihän se mikään salaisuus ole… sitähän minä, sitä


rikasta lukkarin leskeä, jolla on torpan tölläke kirkkokummun
kupeella. Isännäksi mieleni tekee, kun tämäkään virka ei enää lyö
leiville. Rupeatko puhemieheksi?

Pekkala: Ha, ha, ha, onpa sinusta jo tullut aivan pähkä hullu,
huomaan. Vai lukkarin leskeä, ha, ha, ha! Mutta sen sanon, että se
leski ei katso korvillaankaan sinua. Vallesmannihan sitä kuuluu
hyvänä pitävän. Olisit sinäkin iskenyt Sepän Eevaan, rahoja silläkin
oli — vanhalla piialla.

Leiniö: Hyi olkoon! (Heittäikse pitkälleen ja nostaa jalat pystyyn,


laulaa):

Ja se rakkauden kipinä
Joka rinnassa riksuttaa,
Ei taida ennen sammua
Kuin kuolla kupsahtaa.

— Ollapa minullakin muutama tuhat markkaa, niin kelpaisi elää! —


On se peeveliä, kun ei ole äyriäkään ja koirat joka kynnykseltä
haukkuvat. — Lähdetään Pekkala tukkijoelle, siellä kuuluu olevan
leipää ja elämää. (Laulaa):

Tukkipoika se lautallansa
On niin iso herra,
Huh, hei mä laulan vaan
Ja on niin iso herra.

Pekkala: Ei hennota lähteä. Mutta luullakseni olemme tarpeeksi


levähtäneet jaksaaksemme Korpivaaralle.

Leiniö: Ei sitten likikään. (Kuuluu jälleen kirkonkellojen soittoa.)


Vasta aamukirkkoon soitetaan; "ei ole kiirettä kirkkoon, viel' on pappi
paita päällä".

Pekkala: Eihän tässä, mutta sattuu vielä se metsänvartija Raksi


olemaan kulkusalia, kun me näin sunnuntaina…

Leiniö: Antaa tulla vaan. Nyt en huoli hänestä, enkä mistään.


Annetaan pieni ryyppy, jos tulee, niin se mies ei ole tietääkseenkään
koko asiasta. (Viheltelee). Puhuiko Lammin Heikki sulle mitään?

Pekkala: Ei; en ole Heikkiä nähnyt pitkiin aikoikin. Oliko sillä asiaa
minulle?

Leiniö: Heikki hommaa hirvenammuntaan ensiviikolla ja pyysi


minua mukaansa. Sinulle käski minun puhumaan, jos tapaan.
Tuletko? Minä lupauduin.

Pekkala: Hm! Vai hirvenammuntaan.

Leiniö: Niin. Niitä on nähty suuressa parvessa liikkuvan


Kaukorannalla.

Pekkala: Hm! Vaarallista se on, kovin vaarallista. Kiellettyä


tavaraa… ankara sakko jos kiikkiin joutuu. No, joutaahan tuota,
olkoon menneeksi, ehkä sitä läpäsee… Ketä muita tulee?
Leiniö: Vanhalan Jukan ja Tiihosen äijän pitäisi tuleman ja jos sinä
vielä, niin sitten on tarpeeksi.

Pekkala: On kylläkin tarpeeksi, jos ei liiaksi. Turha retki, jos ei


luonnistu. Olkoon menneeksi, minä tulen.

Leiniö: Hyvä, hyvä, sano Hynnisen muori kun pankolta putosi.


(Laulaa:)

Heilani kuoli ja kuopattiin


Tuon tuuhevan koivun alle,
Taas meni pojalta kaks'toista markkaa
Haudan kaivajalle.

Nyt on herttainen aamu, eikö totta. Oi, oi, oi, jospa ihminen saisi
aina maata ja laulaa ja olla huolehtimatta huomisesta päivästä. Se
olisi paratiisi-elämää. (Veisaamista kuuluu etäältä, läheten.) Tuolla
yläilmoissa on varmaan yhtä tyyntä kuin täällä alhaallakin, koska
veisuu kirkosta noin selvään kuuluu. Mitä sinä tuumailet?

Pekkala: Ajattelen vaan sitä hirvijahtia.

Leiniö: Mitäs sillä suotta päätäsi vaivaat, "käydä käsketyn pitää".

(Veisuu kuuluu lähempää.)

Pekkala (Aivastaen): Niin… niinpä kylläkin.

Leiniö (Kääntyy vatsalleen): Kuuntelepas tarkoin — luullakseni tuo


virsi ei ole suntion numerotaulun mukaista.

Pekkala (Nousee): Tulleeko vieraita tänne? Viisainta lienee tästä


lähteä omalle maalleen. (Tähystää.) Ei vielä ketään näy, mutta tänne
tulijan matka kuuluu antavan. Lähde pois!

Leiniö (Miettii hetken, sitten hyppää ylös): Ei, mutta mennään


tuonne Pirunkiven taa, nähdäksemme mimmoinen otus se oikein on,
joka niin lammasvaatteissa kulkee. (Ottaa pyssyn ja linnun maasta.)
Tule pian, ettei ehdi nähdä. Ken tietää, mitä hyvää siitä lähtee.
(Vetää Pekkalan käsipuolesta kiven taa.) Tule nyt vaan!

Pekkala: Ha, ha, aina sinä olet niitä metkuja täynnä…

(Piiloutuvat.)

(Ääni lähenee ja hetken perästä tulee Rajala perältä


oikealta hyräillen jotakin virren nuottia ja kantaen risunippua.
Leiniö ja Pekkala katselevat kallion takaa, kuiskaillen
keskenään).

Rajala (yksin): Hoh, hoo! Turkasen pitkä matka on tänne vanhoilla


koivilla tallustella, vaan ei auta, ei auta. (Heittää risut maahan ja
istuu kivelle.) Hiki oikein tuli, huh huu. Ei ne ennen tällaiset matkat
Rajalan ukkoa uuvuttaneet. Vanhuus tulee, vanhuus tulee, he he…
Kunpa se akka ehtisi sieltä aikanaan, jotta saataisi laittaa latinki
päälle viinakanuunaan, he, he. Olisi tämä ahvääri muuten hyvin
tuottavaa, kunhan vaan saisi viinuskansa keittää ilman pelkoa siitä,
milloin sen käry vallesmannin nokkaan ehtii. — Kukahan lempo
senkin konstin keksi, että kiellettiin kotiviinan poltto. Luulisi niitten
herrojen voivan herkutella muullakin, kuin köyhäin leivällä. Vielä ne
pirut vaanii ja vainoovat, ettei vaan kukaan vahingossakaan viinaa
keittäisi, muut kuin he itse, ne pirut. — Oho, älkööt uskoko sitä
Rajalasta, että hän pelkää. Ee'i. Rajala keittää viinaa kielloista
huolimatta, he, he, he. Minä olenkin kätkenyt leiviskäni sellaiseen
paikkaan, ettei sitä joka mies löydä, ei muut kuin korpit ja
pitkäkorvat, he, he. (Kallion takana vierähtää kivi.) So, so, no per…
kuka siellä? (Kuuntelee.) Eipä tainnut olla vaarallista. Hyi helkkuna
kun säikähdin. Paholainen varmaan velloo Pirunkalliolla, he he.
Vellokoon. Rajalan ukin omatunto on noin niinkuin arka näin
sunnuntai-aamuna, he, he. Ai, ai ukko, mitäs sanoisit, jos jonakin
kauniina päivänä joutuisit kiikkiin. Silloin saisit mennä tiilenpäitä
lukemaan, he, he. Niin saisi, niin saisi… Mutta missä helkkunassa se
ämmä viipynee? Olisikohan metsänvartija Raksi ollut kotoa poissa?
Niin… ellei Raksi olisi komplotissa kanssani, niin taitaisi ammattini
heilua tikun nokassa, he, he. Näin vaarallisessa työssä tarvitaan
kekselijästä miestä ja minussa, he, he, Jumala paratkoon, on vähän
sitäkin vikaa. Raksi hankkii Jumalan viljan ja mitä keitän rokan, he,
he. Mistä minulla olisikaan varoja riittämään asti jyvien
hankkimiseen. Eei… No, johan se viimeinkin tulee. (Rietu tulee
hengästyneenä, kantaen jyvävakkaa.) Missä sinä siellä koko päivän
töpsöttelet? Täällä olen sinua jo ikäni ja aikani odotellut.

Rietu: Älä nyt hyvä ukkoseni, en ehtinyt ennemmin, kun…

Rajala: Eikö Raksi ollut kotona?

Rietu: Sehän se… ei ollut itse… mutta kyllä minä jyviä sain.

Rajala: Missä sinä sitten juorusit. Sitä pitää liikkua työn aikana,
eikä uneksia.

Rietu: Aina sinä haukut minua.

Rajala: Haukut. Eikö ole syytä sitten. Koko päivän yhdellä asialla
viivyt.
Rietu (pelon sekaisesti): Olisinhan minä kyllä pikemminkin
joutunut, mutta kun näin vallesmannin, miehiä mukanaan, tulevan
tänne korpeen, niin tein pitkän kierroksen, etteivät nähneet minua.

Rajala (säpsähtäen): Mitä? Vallesmanniko miesten kanssa? Ja


tänne tulossa? Ethän vaan eukko valehtele?

Rietu: Mitäpä minä nyt sellaista, ihan totinen tosi se on.

Rajala (kynsii korvallistaan): Hm! Saaplari! Minä pelkään, että ne


ovat saaneet vihiä… Mutta olkoot! Ei ne tänne saakka osaa
kuitenkaan tulla, ei ainakaan vallesmanni suuren mahansa kanssa.
Eikä sitä niin vaan löydetäkään, ei. Mutta mennään nyt polttimolle.
Sinä saat jäädä pitämään vahtia siksi aikaa, kun minä käyn kotoa
hakemassa Heikkilän Matin viina-nassakan ja samalla tutkin, onko
sanoissasi perää.

Rietu: Mutta jos ne, vallesmanni ja muut tulevat? Minua niin


pelottaa…

Rajala: Älä siinä turhia höpise! Mistä ne tietävät, missä sinä olet,
kun pidät suusi lukossa.

Rietu: Voi, voi sentään, sinua Rajala. Kyllä sinun pitäisi lopettaa
tämä viheliäinen viinankeitto. — Ei Jumala salli sinun enää kauan
pilkata itseään, näin sunnuntaisin varsinkin… joudumme vielä tästä
linnaan… Voi voi sentään…

Rajala (kiukkuisesti): Linnaan! Tuki jo turpasi ämmä, taikka annan


vasten kuonoasi!

(Ottaa risukimpun ja menee perälle vasemmalle.)


Rietu (yksin): Voi hyvä Jumala sentään; mikähän meidät lopulta
sentään perii? Jos kuinka koittaisin sitä estää tällaista syntiä
tekemästä, niin ei se auta; kuuroille korville lankeaa aina pyyntöni.
Voi, voi, tuntuu niin vapisuttavankin tuolta sydänalastani.

Rajala (Huutaa): No etkö sinä saaperin ämmä pääse sieltä,


muuten…

Rietu: Tulen… tulen… tulenhan minä ihan tässä tuokiossa. Voi


hyvä isä armahtakoon meitä vaivaisia syntisiä!

(Menee perälle vasemmalle.)

Leiniö: Ha, ha, ha! Kaikkia sitä näkee ja kuulee, ennenkuin kuolee.
Nyt Pekkala, meillä on kala koukussa, emmekä sitä laske
käsistämme. Ole sinä täällä hetkinen, minä otan selvää missäpäin se
herrasväen viinakanuuna on… Eikös se ollut Rajala, tuo äijä?

Pekkala: Oli, oli, Rajala se oli.

Leiniö: Odotahan nyt, tulen pian…

(Menee perälle vasemmalle.)

Pekkala (yksin): Aika vekkuli tuo Leiniö. Kala koukussa; kun ei


vaan itse joutuisi koukkuun. — Hm! Vai on Rajala ruvennut viinan
keittoon, enpä olisi uskonut jos joku olisi sanonut. Kummaa, kun niin
rauhassa on saanut olla, etteivät ole linkkuun pistäneet. —
Vallesmannissa ehkä on syy. Sehän se onkin sellainen lihavan laiska,
joka ei viitsi paljon metsiä juoksennella. — No, onhan se hyvä
niinkin, jos on toisinkin. (Tähyää.) Mitenhän kauas se Leiniö mahtoi
mennä. — Kas, siinähän se tuleekin.
Leiniö (Palaa, kuiskaten): Nyt tiedän! Se mylly on ihan tässä,
tuossa noin, vähän vasemmalle ja sellaisessa tiheikössä, ettei
lempokaan sitä huomaa, ellei ole opasta. Ei uskoisi siinä risuläjässä
löytyvän niin salaisia asioita. Äijä kuului akkaansa varoittelevan
torkkumasta. Mahtanee olla aika unikeko. Jahka äijä menee pois
sieltä, niin tarkastelemme laitosta lähemmin.

Pekkala: Mitä vielä! Lähdetään kotia ja annetaan Rajalan keittää


viinaansa rauhassa. Eihän se meitä liikuta.

Leiniö: Mitä? Joko sinua rupeaa jänistämään? No, jos tahdot, niin
mene, minä ainakin jään tänne ja otan asiasta selvän.

Pekkala: Enhän minä nyt yksin, mutta jos sinäkin tulet, niin…

(Kuuluu ääniä oikealta.)

Leiniö: Kuules — nyt äijä tulee. Pistäytäänpä jälleen


rintavarustuksiimme.

Pekkala: Ei se ole Rajalan ääni. Ehkä jo vallesmanni miehineen.


Puhuihan akka nähneensä vallesmannin.

Leiniö: Sitten on syytä joutua sukkelaan syrjään!

(Piilottautuvat. Juuri kun he ehtivät asettautua, tulee


Vallesmanni, virkalakki päässä ja miehiä mukanaan, oikealta.)

Vallesmanni (pyyhkii hikeä otsaltaan): Tjevula sanka skog. Ei takto


lepi peestä… huh .. ja lemmin, niin tjevula lemmin… Vieläkö olla
pitke matka sin' Pirukallo?
Joku miehistä: Tässä sen pitäisi olla. Ja tuossa se onkin, se
kiviröykkiö, jota sanotaan Pirunkallioksi.

(Rajala tulee perältä vas., mutta huomattuaan Vallesmannin,


piiloittautuu pensaikkoon).

Vallesmanni: Jaha, jaha, me olla sitt' pian perille. Telle seutu se


pitis olla se sprii fabrik… (miettii) piru… piru… kah… jaha pirukallo…
i… niin… aivan oikke aivan oikke he sanoma att se olla vid Pirukallo…

Raksi (tulee vas. etualalta, pyssy kädessä): (Its.) Pahuusko


tuonkin tänne viiletti. (Ääneen, kohteliaasti nostaen lakkiaan.) Hyvää
huomenta, herra Vallesmanni. Mitä herra Vallesmanni näin kaukaa
on etsimässä?

Vallesmanni: Ka, no, peive, peive, herr Raks. Te tulla parahiks.


Mine hake eres rakkari, eres Mathias Rajala. Hän pites bränna sprii
teel Pirukolos… nej teel Pirukallo seutu. Herr Raks olla kai niin hyve
och hjälpa minu siin, jos jouta vaan. Te tunte parempi teme skog,
kun mine, ja mine pites hajotta maa tasall se Rajalas fabrik. Kylle
mine maksa vaivanäkö. Taktoko herr Raks hjälpa mej?

Raksi: Kyl-lä, miks'ei. Eihän minulla mitään kiirettä ole näin


sunnuntai-aamuna. Hm! Vai niin, vai Rajalaa epäillään viinanpoltosta.

Vallesmanni: Ja vist. Rajala niin. Ehke herr Raks olla sattuma


näkemä hene teel kulkema kun olla aina metsä.

Raksi: Olenhan joskus nähnyt hänet täällä risuja kokoomassa. En


ole tullut kuitenkaan ajatelleeksikaan, että hän niin huonoa ammattia
harjoittaisi. Hän on aina ollut niin rehellisen näköinen… (its.) Aivan
kuin minäkin; enpä haluaisi Rajalaa saada pulaan. Parastani koetan.
Vallesmanni: Hm! Jaa… rehellinen. Han olla aika kettu, se Rajala,
siksi olla rehelline, ja kun mine sain teedä, att han bränna itse viina,
ni minä peeti heti nappata kiin se rakkari. — Mut meiden pite börja
heti paikka hakema ylös peripohja teme skog. Herr Raks sano mist'
olla paras alotta.

Raksi (its.): Minun täytyy johdattaa tuo mörkö harhaan, muuten


piru vie minutkin. (Ään.) Ehkä olisi sopivampi tuolta Kissansuon
laidasta alottaa. Siellä on metsä kovin tiheää, kenties se juuri sieltä
löytyisi… (its.) Ainakin on löytymättä!

Vallesmanni: Niin, mennä nyt mannit sinne.

(Menevät vasemmalle etualalta).

Raksi (yksin): Turkasen tuli! Enpä olisi välittänyt koko jahdista.


Mutta eihän sitä sopinut kieltääkään mokomalta mongertajalta.
(Yrittää lähtemään miesten jälkeen, mutta huomaa Rajalan, joka
lähenee varovaisesti.) Kas, sinäkin täällä!

Rajala: Hyvää huomenta. Millä meiningillä se tuo pöntsööri nyt on?

Raksi: Voi hyvä mies, se hakee juuri sinua, kuten kuulit, jos
kuuntelit. Miten me nyt pääsemme pälkähästä, jos ne sattuvat
aparaattisi löytämään?

Rajala (harmistuneena): Ja sinäkin lupasit vielä auttaa!

Raksi: Enhän uskaltanut kieltää, niinkuin käsität, kun hän itse


pyysi. Olisin mielelläni ollut seitsemän penikulman päässä tältä
paikalta silloin kun tuon mötäksen kohtasin. Mutta ollaan huoletta,
eivät ne vielä ole sitä löytäneet ja kyllä minä puolestani koetan
eksyttää heitä. — Kuules, Rajala, olethan mies? Sano, voinko luottaa
siihen, ettet anna minua ilmi siinäkään tapauksessa, jos nuo
sattuisivat löytämään piilopaikan. Minä puolustan sinua käräjillä
minkä voin ja jos sakkoa saat niin pidän huolen sen maksamisesta.
— Luultavasti sinä kyllä sen lupaatkin, sillä joka tapauksessa saat
kuitenkin itse kaiken kärsiä. Eihän kukaan uskoisi minua
osakkaaksesi, vaikka kannustaisitkin päälleni. Paras siis on olla vaiti,
eikö totta? Ehdollani en missään tapauksessa tule ohjaamaan heitä,
mutta jos he sen löytävät ilman minun avuttani, niin… (Vallesmannin
ääni: Herr Raks, herr Raks, tulka vehe tenne!) Tulen heti. — Nyt se
mölli jo huhuilee. No, mitä sanot?

Rajala (Ojentaa kätensä): Tuoss' on käteni. Ei kukaan tule


tietämään, että olet osamies.

Raksi: Tiesinhän sen, sillä tunnenhan sinut kunnon mieheksi.


Hyvästi näkemään. — Ai mutta saitkos jyviä, kun en itse ollut
kotosalla?

Rajala: Akka kävi hakemassa vakallisen. Hän jäi sinne pannun luo
vahtiin, kun minun pitää mennä kotoa viinalekku hakemaan. Unhotin
sen.

Raksi: Ethän vaan vielä ole sytyttänyt tulta?

Rajala: En toki niin varomaton ollut. Akka kertoi nähneensä


vallesmannin ja siksi en sytyttänyt.

Raksi: Hyvä, hyvä; nyt minun pitää mennä.

(Menee.)

Rajala (yksin): Katso konnaa! Tuota aavistin. Hm! Tarvitsisipa,


totta vie laskea hyvällä haulikolla silmät sisään ryökäleeltä. —
Kukahan piru sille on käynyt manaamassa. Sitä olisi hauska tietää.
Eiköhän vaan liene se lukkarin leski, joka on niin hurskas ja
jumalinen päivän valossa, mutta yöllä… silloin kyllä peittää pimeys
valkeuden työt. — Joo, se saatana sen on varmaan tehnyt, sillä hän
asuu lähinnä minua ja tuo ihralaiva käy siellä vierailemassa öisin.
Jumaliste sentään! Jos vaan saan selville, että hän on ilmoittanut niin
kostanpa totta vie kostan! Poltan koko talon jonakin yönä, kun
vallesmanni on sisällä ja heidät talon mukana! Älkööt huoliko! Kyllä
minä ne asiat selville saan, saan jumaliste!… poltan koko
kanatarhan, niin että räiskyy vaan!

(Menee perälle oikealle.)

Leiniö: Sitäpä kesti odottaa.

Pekkala: Ha, ha, haa! Kuulitko mitä Rajala kertoi lukkarin leskestä?
Vieläkö tekee mielesi isännäksi hänen taloonsa?

Leiniö (Naurahtaen): Eipä juuri. Mutta nyt jätetään naima-asiat


toiseen kertaan. Täällä näyttää sukeutuvan jotain hauskaa lopulta.
Huomasitko sinä sitä, että metsänvartija on osakas Rajalan
viinakanuunassa? Nyt toimeen Pekkala, oikein tullimiehen toimeen.
Nyt pitää ensiksi tarkastaa, onko siellä meille sopivaa tavaraa,
ennenkuin korpit haaskalle ehtivät.

Pekkala: Jottako viinaa saisimme! Ehei! Emme taida sillä hyötyä.


Vastahan ne meinasivat alottaa valmistamisen. — Mutta voidaanhan
käydä katsomassa. Ei ota jos ei annakaan.

(Menevät perälle vasemmalle.)


Rajala (palaa): Taisin pudottaa avaimeni tuossa ryömiessäni.
(Etsii.) Aivan oikein; siinähän se on. — Tekisi mieleni palata
varoittamaan akkaa, mutta… No olkoon! Parempi kun pysyn nyt
loitommalla. On se sentään saakuria koko tämä juttu. Jos ne peevelit
löytävät tehtaani, niin hukassa olen. Onhan tässä kumminkin jotain
toivoa kun tuo Raksi… vaikka en tiedä siitäkään miehestä, epäilys
alkaa kohota häneenkin… Jos tässä hullusti käy, niin pianpa hän
jättää minut oman onneni nojaan. Ja kukapa tosiaankin uskoisikaan
minua, vaikka kannustaisinkin lakituvassa hänen päälleensä? Ei niin
kukaan. Mistä ottaisin todistajia. Hm! Saisin vielä väärästä
ilmiannosta toisen mokoman niskalleni. Peeveli sentään! Kyllä olen
nyt joutunut kiirastuleen… Mutta ei! (Nousee.) Ei tässä asiat
suremalla parane! Surkoon hevonen, jolla on suurempi pää. Yrittää
sitä pitää ja keinoja keksiä! Ei sitä Rajala ole ensikertaa pappia
kyydissä, eipä niinkään, eipä niinkään… Mutta olinpa aivan unhoittaa
koko toimeni… Hm! Ompas se nyt koko juutasta, ompas se… (Menee
perälle oik. päätään raappien.)

(Näyttämö hetken tyhjä. Lintujen viserrystä kuuluu. Vähän


ajan kuluttua tulee Leiniö, kantaen viina-ankkuria ja hänen
jälessään Pekkala.)

Leiniö (Laskee ankkurin maahan): Joka etsii se löytää!

Pekkala: Ja kolkuttavalle avataan, ha, ha, ha! Sukkelasti se


kävikin. Akka ei tiennyt mitään, vaikka hänetkin olisi ottanut
mukaansa. Ha, ha, haa! minua alkaa jo huvittamaan tämä koko
seikkailu.

Leiniö (Koettaa avata astiaa): Joko jo? — Aina sitä saa kun
vuovaa… Hyvä mies, kelpo mies se Rajala. — Äh! Onko sulla
puukkoa mukana?
Pekkala: Aijotko sitten avata sen täällä? Eiköhän sentään olisi
viisainta, että mentäisi kotiin saaliinemme. Ymmärrät kyllä miksi.
Koirajoukko on kintereillä ja minulla, tottavieköön, ei ole halua
joutua niitten pureskeltavaksi.

Leiniö: Ei niin hätää, miltä näyttää. Täytyyhän sitä tullata ensin,


jotta tiedämme, vettä vaiko tervaa se sisällään pitää. Annahan
puukko tänne. Tappi istuu peijakkaan lujassa.

Pekkala: Tuoss' on. Vaikka ehtisimme tullata kotonakin. Sattuvat


vielä tulemaan…

Leiniö: Elä sure… Kas niin, nyt maistetaan. Saakuri kun ei ole
mitään astiaa. Täytyy imeä tapinreiästä. Maista nyt.

Pekkala: Ei, ota sinä ensin, sinäpä siinä suuremman työnkin olet
tehnyt.

Leiniö: Tässä ei tule kysymykseen kumpi enemmän tai vähemmän


on tehnyt. Mutta koska tahdot, niin olkoon menneeksi! Rajalan
onneksi! (Juotuaan vääristää pahasti suutaan.) Äh! Sinä pyhä
yksinkertaisuus! Siinä liemessä on siunausta. Ihan hiuksissa kihajaa
ja suonissa sihajaa. He, koeta sinäkin, se ei ole akkain
sukanpesuvettä.

Pekkala (Juo, on läkähtymäisillään): Voi pi-i-ru se-e v-vie aivot


sekaisin.

Leiniö: Ha, ha, ha, enkö sitä sanonut! Mutta kun tottuu niin
harjaantuu, sano entinen äijä. (Juo.) Siitä saamme oivallista tavaraa,
kun lisäämme pari saavillista vettä. Nyt on meillä pitkiksi ajoiksi
känninkiä. Ota vielä kulaus ja sitten lähdemme saaliinemme kotiin.
Pekkala (estellen): En, en ota enää. Tuntuu jo pääni olevan täysi.
Jos vielä otan, en pääse paikaltani liikahtamaan.

Leiniö (johon väkevä viina alkaa vaikuttaa): Mitä, aijotko estellä


silloinkun tarjolla on. Kallista pois vaan, ei sitä aina ole tällaista
saatavissa. No älä siinä mulkoile, juo pois vaan!

Pekkala (naurahtaen): Ha, ha, haa! Mutta kuka meidät sitten kotiin
laahaa, kun tulemme aivan äälättömäksi.

Leiniö: Huoli sinä siitä — kyllä herra omistaan huolen pitää!


(Laulaa rallittaa; on jo tuntuvasti päissään):

Ja mamma se sanoi että ah voi voi,


Kun liekutti lullani laitaa.
Mikäkän maailman koijari, oi
Mun pojastani tulla taitaa.

Pekkala (On innostunut maistelemiseen ja on tuon tuostakin


kallistanut ankkuria; hänkin on jo hyvin humaltunut): Ha, ha, ha! Vai
sanoi äitisi sillä lailla.. (Nousee vaivaloisesti ylös.) Äh! Kuuleppas nyt
kampraati! Eiköhän sitä jo olisi aika lähteä niinkuin kotiinpäin
koettamaan…

Leiniö: Ei sitä tässä hätä pakota. Ole alallasi! (Vetää takinhelmasta


Pekkalaa, joka kaatuu Leiniön yli ja satuttaa nenänsä puun kylkeen.)
Ha, ha, ha, haa!

Pekkala (Nousee pitäen nenästään; vihaisesti): Mitä sinä mies


oikein meinaat! Tahdotko riitaa rakentaa? Jos sinä tässä rupeat
komeilemaan, kun minä kauniisti puhun, niin… (Painaa kädellään
puukon tuppeen; tarkoituksellisesti): Sinä tunnet minun…
Leiniö: Aijotko antaa minun maistaa puukkoasi, niinkö? Hah, hah,
vahinko vaan, että tuo ihana kapine on nyt minulla, ha, ha, ha, joten
säästyy turkkini ainakin tällä kerralla. — Suutuitko sinä todellakin?

Pekkala (entiseen tapaan): Luulenpa että sinä aiot pitää minua


pilkkanasi! Mutta minä sanon sinulle ja näytän, ettei Pekkala olekaan
mikään nauku-Maijan poika… niin! Älä ärsytä minua nyt enää!

Leiniö (lepytellen): Älähän nyt turhista… enhän minä mitään pahaa


tarkoittanut. Leikkiä se oli. Ymmärtäähän hullukin leikin.

Pekkala: Hullukin? Olenko minä hullu sinun edessäsi? Häh?

Leiniö: Olet totisesti, ellet istu tuohon ja maista vielä. Noh,


sovitaan pois! Vanhat ystävät, mitä me viitsisimme riidellä turhasta.

Pekkala (leppyneemmin): Mitä sinä sitte tässä turhia jaanaat.

Leiniö: En koskaan enää sano pahaa sanaa sinusta. Lyödään


sovinnon kättä ja ryypätään päälle!

(Ojentaa kätensä.)

Pekkala: Olkoon menneeksi.

(Lyövät kättä ja maistelevat.)

Leiniö: Kyllä kai me sentään lähdemme kotiin. Haeppas sinä, hyvä


mies, pyssymme tuolta Pirunkiven takaa, minä vuolen uuden tapin
tähän reijän suulle.

Pekkala: No, kyllähän minä…


(Menee hoiperrellen kallion taa, jonne kaatuu suurella
ryminällä ja jää paikalleen makaamaan.)

Leiniö (vuolee tappia):

Koijari olen minä ollutkin


Ja koijaaman mun pitää…

Äs… per… hyvin se näyttää pystyvän ihmisen lihaan… hyi olkoon.


Ha, ha, ha, Pekkala aikoi antaa puukosta… aika eläin se Pekkala.
(Lyö tappia kiinni.) Kas niin. (Nousee kovin juopuneena.) Oh, oh!
Kovin se tukkaan tuikahtikin. Kuinkahan sitä tästä oikein päästään.
— Mutta mihin hiivattiin Pekkala jäi? (Menee kallion taa.) No, voi sun
tallukkamatin saapas! Täällä poika on kaikessa rauhassa Abrahamin
helmassa. (Kiskoo jalasta.) Hei Pe-ek-ka-la ku-i-inka se oli ko-ko-ti-
mat-kan ka-ka-nssa. (Pekkala mörisee jotakin.) Oletpa tainnut
veliseni, parhaimman osan valita. — Mitähän, jos seuraan
esimerkkiäsi… iltakin taitaa jo olla käsissä. Samapa se on missä
nuorimies yönsä viettää. — Siirräpäs vähän koipiasi mies. (Heittäytyy
pitkälleen.) Ohhoo-hoo… noin käsikaulassa vaan… hy-v-ää y-yö-tä
Pe-k-ka-la.

(Vähän ajan kuluttua nukkuvat.)

Rajala (tulee): Ei minä en saa rauhaa. Sydämeni läpättää kuin


hylkeennahkainen tupakkakukkaro. (Pyyhkii hikeä otsaltaan.) Tämä
päivä on kirottu päivä. Koko maailma haisee helvetin kärylle ja pirut
ympärilläni viheltävät…

(Menee vasemmalle etualalle.)

(Äänettömyys.)
Pekkala (kirkaisee): Ai, ai, ai! Sääreni taittuvat!

Leiniö (unenpöperryksissä): Vai sääriäsi… älä mökötä… herätät


koko talonväen… Nuku vaan rauhassa, muuten piru sun vie
kokonaan… senkin peruna…

Rietu (tulee perältä vasemmalta voivotellen, hirmuisen


pelästyneen näköisenä): Hyvä isä, missähän Rajala viipynee, voi voi
voi. Kyllä minun nyt käy hullusti, voi voi sentään. Minä onneton kun
torkuin, hetkeksi vain torkuin, ja silläaikaa ovat varastaneet viina-
ankkurin. Voi voi sentään, en ymmärrä kuka se olisi voinut olla, kun
ketään ei näy eikä ole näkynyt. (Peittää liinalla kasvonsa.) Voi kuinka
uskallan näyttäytyä Rajalan silmäin edessä! Se tappaa minut
varmaan… voi, voi, ja ainoat viinat menivät hukkaan… voi voi
sentään minun poloisen päiviäni… (Menee perälle oikealle).

(Lyhyt äänettömyys.)

Rajala (Ääni kuuluu perältä vasemmalta): Voi tuhannen


tulimmaista viisikymmentä laivanlastia! Mihin hornan tuuttiin se akka
ryökäle on luistanut? (Tulee kiukkuisena.) Viinat on viety, akka on
viety ja kaikki on viety! Varmastikin tulee nyt minun vuoroni. Tämä
nyt on vasta kaunista! Maailma on ihan mullin mallin. (Raivoo.)
Mutta kun saan sen ämmän ryäkäleen käsiini, hakkaanpa sen…
hakkaanpa niin, että lihat luista lähtee… (Lankeaa viina-ankkuriin.)
Mikä pirun, pirun, pirun piru siihenkin on ansansa virittänyt. Mutta
siinäpähän se onkin se kadonnut lammas! Ei se siis olekkaan vielä
joutunut vallesmannin kynsiin. Mutta miten hitossa se tänne on
joutunut? — Varmaankin varastettu… Mutta oli miten oli, pirun hyvä
vaan että löysin. Vieköön nyt ämmänkin vaikka itse pelsepuupi!
(Kätkee viina-ankkurin pensaikkoon. Kuorsaamista kiven takaa.) Mikä
siellä… (Hiipii kuorsaamista kohden ja kuuntelee.) Ai, ai, nyt
ymmärrän. Varmaankin on varas maisteltuaan uupunut. Kas niin,
arvasinhan, täällähän niitä on kaksittain ja oikein pyssyjen kanssa,
vieläpä lintukin pään alla. Odottakaapas, veijarit, kyllä opetan teidät
leiliä pesemään. Tunnen sinut Leiniö. Tunnen sinut Pekkala.
Mokomat salakytät. Luuletteko teidän virkanne olevan
kunniallisempaa kuin minunkaan. (Ääniä kuuluu vas.) Ahaa, sieltä
tulee varmaan vallesmanni. Mitähän jos antaisin ilmi heidät. Ei
saamari, saattaisin vielä itsenikin kiikkiin. Paras kun vaikenen nyt.
Tuossa ne jo ovatkin.

(Piiloutuu puun taakse. Vallesmanni ja Raksi tulevat.)

Vallesmanni: Ah se olla djevula vast' att löytä sitt förbannahist, ja


kummikin ne sano, att sen pite olla här.

Raksi: En usko vieläkään todeksi. Luulen vain, että joku on


valhetellut saadakseen herra vallesmannin näin väsyttävään toimeen
ryhtymään.

Vallesmanni (Miettii): Jaa… jaa…

Rajala (its.): Olisipa onni, jos eivät löytäisi. Mutta mitenkä pääsisin
minä tästä ikävästä asemasta?

(Horjahtaa vähäsen, jolloin risut risahtavat.)

Vallesmanni (havahtuu): No mike piru siell' puu takana olla. Tulla


pois!

Rajala (Its.): Nyt se räjähtää. Koeta nyt konstejasi Rajala. (Astuu


esiin lakki kourassa.) Suokaa anteeksi herra vallesmanni. Minun
aikomukseni oli heti tulla esiin puhutellakseni teitä, mutta en
Welcome to our website – the perfect destination for book lovers and
knowledge seekers. We believe that every book holds a new world,
offering opportunities for learning, discovery, and personal growth.
That’s why we are dedicated to bringing you a diverse collection of
books, ranging from classic literature and specialized publications to
self-development guides and children's books.

More than just a book-buying platform, we strive to be a bridge


connecting you with timeless cultural and intellectual values. With an
elegant, user-friendly interface and a smart search system, you can
quickly find the books that best suit your interests. Additionally,
our special promotions and home delivery services help you save time
and fully enjoy the joy of reading.

Join us on a journey of knowledge exploration, passion nurturing, and


personal growth every day!

ebookmasss.com

You might also like