100% found this document useful (1 vote)
29 views

Learning Advanced Python by Studying Open Source Projects 1st Edition Li All Chapters Instant Download

Source

Uploaded by

hannaygreif
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
29 views

Learning Advanced Python by Studying Open Source Projects 1st Edition Li All Chapters Instant Download

Source

Uploaded by

hannaygreif
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 62

Download the full version of the textbook now at textbookfull.

com

Learning Advanced Python by Studying Open


Source Projects 1st Edition Li

https://textbookfull.com/product/learning-
advanced-python-by-studying-open-source-
projects-1st-edition-li/

Explore and download more textbook at https://textbookfull.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

Firm Sponsored Developers in Open Source Software Projects


A Social Capital Perspective Dirk Homscheid

https://textbookfull.com/product/firm-sponsored-developers-in-open-
source-software-projects-a-social-capital-perspective-dirk-homscheid/

textbookfull.com

Deep Learning for Remote Sensing Images with Open Source


Software 1st Edition Rémi Cresson

https://textbookfull.com/product/deep-learning-for-remote-sensing-
images-with-open-source-software-1st-edition-remi-cresson/

textbookfull.com

How Open Source Ate Software: Understand the Open Source


Movement and So Much More Gordon Haff

https://textbookfull.com/product/how-open-source-ate-software-
understand-the-open-source-movement-and-so-much-more-gordon-haff/

textbookfull.com

Learning d3 js Data Visualization Ændrew Rininsland

https://textbookfull.com/product/learning-d3-js-data-visualization-
aendrew-rininsland/

textbookfull.com
Strategy-Making in the EU: From Foreign and Security
Policy to External Action Pol Morillas

https://textbookfull.com/product/strategy-making-in-the-eu-from-
foreign-and-security-policy-to-external-action-pol-morillas/

textbookfull.com

Design Ethnography: Epistemology and Methodology Francis


Müller

https://textbookfull.com/product/design-ethnography-epistemology-and-
methodology-francis-muller/

textbookfull.com

Interactive Modeling and Simulation in Business System


Design 1st Edition Ella Roubtsova (Auth.)

https://textbookfull.com/product/interactive-modeling-and-simulation-
in-business-system-design-1st-edition-ella-roubtsova-auth/

textbookfull.com

Web Security for Developers Real Threats Practical Defense


1st Edition Malcolm Mcdonald

https://textbookfull.com/product/web-security-for-developers-real-
threats-practical-defense-1st-edition-malcolm-mcdonald/

textbookfull.com

Mind over matter a comprehensive guide to discovering your


psychic powers Auerbach

https://textbookfull.com/product/mind-over-matter-a-comprehensive-
guide-to-discovering-your-psychic-powers-auerbach/

textbookfull.com
Curtiss P 40 Long nosed Tomahawks 1st Edition Carl
Molesworth

https://textbookfull.com/product/curtiss-p-40-long-nosed-
tomahawks-1st-edition-carl-molesworth/

textbookfull.com
Learning Advanced Python by
Studying Open Source Projects
This book is one of its own kind. It is not an encyclopedia or a hands-on tutorial that traps
readers in the tutorial hell. It is a distillation of just one common Python user’s learn-
ing experience. The experience is packaged with exceptional teaching techniques, careful
dependence unraveling and, most importantly, passion.
Learning Advanced Python by Studying Open Source Projects helps readers overcome the
difficulty in their day-to-day tasks and seek insights from solutions in famous open source
projects. Different from a technical manual, this book mixes the technical knowledge, real-
world applications and more theoretical content, providing readers with a practical and
engaging approach to learning Python.
Throughout this book, readers will learn how to write Python code that is efficient,
readable and maintainable, covering key topics such as data structures, algorithms, object-
oriented programming and more. The author’s passion for Python shines through in
this book, making it an enjoyable and inspiring read for both beginners and experienced
programmers.

Rongpeng Li (Ron) is a YouTube educator and animator. He has a consistent passion for
education. He has published two books on statistics and scientific simulation.
Chapman & Hall/CRC
The Python Series

About the Series


Python has been ranked as the most popular programming language, and it is widely used
in education and industry. This book series will offer a wide range of books on Python
for students and professionals. Titles in the series will help users learn the language at an
introductory and advanced level, and explore its many applications in data science, AI, and
machine learning. Series titles can also be supplemented with Jupyter notebooks.

Image Processing and Acquisition using Python, Second Edition


Ravishankar Chityala, Sridevi Pudipeddi
Python Packages
Tomas Beuzen and Tiffany-Anne Timbers
Statistics and Data Visualisation with Python
Jesús Rogel-Salazar
Introduction to Python for Humanists
William J.B. Mattingly
Python for Scientific Computation and Artificial Intelligence
Stephen Lynch
Learning Professional Python
Usharani Bhimavarapu and Jude D. Hemanth
Learning Advanced Python by Studying Open Source Projects
Rongpeng Li

For more information about this series please visit: https://www.crcpress.com/Chapman--


HallCRC/book-series/PYTH
Learning Advanced Python by
Studying Open Source Projects

Rongpeng Li
Cover image: Rongpeng Li

First edition published 2024


by CRC Press
2385 Executive Center Drive, Suite 320, Boca Raton, FL 33431

and by CRC Press


4 Park Square, Milton Park, Abingdon, Oxon, OX14 4RN

CRC Press is an imprint of Taylor & Francis Group, LLC

© 2024 Rongpeng Li

Reasonable efforts have been made to publish reliable data and information, but the author and publisher cannot
assume responsibility for the validity of all materials or the consequences of their use. The authors and publishers
have attempted to trace the copyright holders of all material reproduced in this publication and apologize to
copyright holders if permission to publish in this form has not been obtained. If any copyright material has not been
acknowledged please write and let us know so we may rectify in any future reprint.

Except as permitted under U.S. Copyright Law, no part of this book may be reprinted, reproduced, transmitted, or
utilized in any form by any electronic, mechanical, or other means, now known or hereafter invented, including
photocopying, microfilming, and recording, or in any information storage or retrieval system, without written
permission from the publishers.

For permission to photocopy or use material electronically from this work, access www.copyright.com or contact the
Copyright Clearance Center, Inc. (CCC), 222 Rosewood Drive, Danvers, MA 01923, 978-750-8400. For works that are
not available on CCC please contact [email protected]

Trademark notice: Product or corporate names may be trademarks or registered trademarks and are used only for
identification and explanation without intent to infringe.

Library of Congress Cataloging-in-Publication Data


Names: Li, Rongpeng, author.
Title: Learning advanced Python from open source projects / Rongpeng Li.
Description: Boca Raton, FL : CRC Press, 2024. | Series: Chapman & Hall/CRC
the Python series | Includes bibliographical references and index.
Identifiers: LCCN 2023024040 (print) | LCCN 2023024041 (ebook) |
ISBN 9781032328164 (paperback) | ISBN 9781032328188 (hardback) |
ISBN 9781003316909 (ebook)
Subjects: LCSH: Python (Computer program language) | Open source software.
Classification: LCC QA76.73.P98 L49 2024 (print) | LCC QA76.73.P98
(ebook) | DDC 005.13/3—dc23/eng/20230725
LC record available at https://lccn.loc.gov/2023024040
LC ebook record available at https://lccn.loc.gov/2023024041

ISBN: 978-1-032-32818-8 (hbk)


ISBN: 978-1-032-32816-4 (pbk)
ISBN: 978-1-003-31690-9 (ebk)

DOI: 10.1201/9781003316909

Typeset in Minion
by codeMantra
To Yan, the brightest light in my life.
To my family, whose decisions made my life today possible.
To Holly and Prosper, the endless source of joy in the room.
Contents

Preface, x
Acknowledgments, xi

IntroductIon 1
PURPOSE AND SCOPE OF THIS BOOK 1
OVERVIEW OF THE APPROACH TAKEN 3
NOTE 4

C
A GENTLE INTRODUCTION TO PYTHON’S DATA MODEL 5
CUSTOMIZED COMPARISON 7
A MANAGED ITERATION BEHAVIOR 12
ATTRIBUTES, FUNCTION OR DICTIONARY? 16
SUMMARY 20
NOTES 20

C
INTRODUCTION 21
DESCRIPTORS AND ATTRIBUTE LOOKUP ORDER 21
Descriptor Demystified 21
Lazy Evaluation in Matplotlib 25
METACLASS AND ITS USAGE IN ELASTICSEARCH DSL 30
Understanding Metaclass Using Meta-Recipe 30
Use Metaclass to Model Documents in Elasticsearch DSL 35
SUMMARY 40
APPENDIX 40
NOTES 41
viii   ◾    Contents

C
CONCURRENCY FROM A TOP-DOWN PERSPECTIVE 42
Operating System and Concurrency 45
Introducing Global Interpreter Lock (GIL) 47
MULTIPROCESSING FOR CPU BOUND TASKS 48
Parallel Pandas Apply in pandarallel 52
MULTITHREADING FOR I/O BOUND TASKS 58
SUMMARY 63
NOTES 63

C
A SHIFT OF PARADIGM 64
EVENT-DRIVEN SIMULATION 65
ASYNC AS A PATTERN 71
SUMMARY 75
APPENDIX 75
NOTES 76

C
INTRODUCTION 77
THE DECORATOR FOR RETRYING A FUNCTION 77
CONTEXT MANAGER IN A NUTSHELL 81
DIVE INTO THE AIOSQLITE EXAMPLE 84
Connection as an Executor and a Scheduler 85
Connection and Cursor as Async Context Managers 88
SUMMARY 93
NOTES 93

C
UNDERSTAND YOUR BUSINESS 94
A Quick Overview of the Business 95
MODEL THE BUSINESS ENTITIES WITH OOP 97
Design the Core Entities 97
Establish the Relationship between Classes 100
The Benefits of Universal interface 104
Sometimes No OOP is the Best Design 106
Contents   ◾    ix

SUMMARY 108
NOTES 108

C
INTRODUCTION 109
FIXTURE AND PARAMETERIZATION 109
Parameterization 111
Resources and Fixture 113
MONKEY PATCH 115
Modify the Built-in Print 115
More Powerful Monkey Patching 117
PROPERTY-BASED TEST 118
SUMMARY 122
NOTES 122

INDEX, 123
Visit https://textbookfull.com
now to explore a rich
collection of eBooks, textbook
and enjoy exciting offers!
Preface

I am very excited and happy to present this book to you.


This book is somewhat like my previous two books. Not because they share similar
topics, but because I wrote it with a vivid image of readers in my mind. In my opinion, a
book like this should have existed long before: there are tons of great open source Python
projects, and there are a lot of people who find it hard to learn advanced Python topics. It is
natural to have a book that seamlessly bridges the golden resources and the hungry learn-
ers. This book is it. When I tried to learn from the pros, I did it the hard way by bashing
my head and absorbing much-alike materials from 20 browser tabs. Looking back, I think
there are better ways to do it: an educational and instructional way. My experience as an
instructor helped me a lot in writing this book: I am able to put my feet in the learners’
shoes.
I am very grateful to the editors at Taylor & Francis who helped me identify and con-
firmed the value of this approach. I hope you find this experimental approach educational,
accessible and entertaining.

x
Acknowledgments

I would like to thank the creators, maintainers and all contributors to the open source
projects I used as examples in this book.
It is unimaginable if those amazing resources are not freely accessible to me and to
everyone around the globe. The open source movement has astronomically impacted not
only the software engineering but also the advance of technology universally.
Thank you, from the bottom of my heart.

xi
Introduction

PURPOSE AND SCOPE OF THIS BOOK


Learning Advanced Python by Studying Open Source Projects is a book that is written for
95% of Python users, covering 95% of their daily use cases.
What does this mean?
From the content perspective, it means that this book is not an encyclopedia that covers
everything. It covers all the important things for most Python users.
Based on my observations and research, the following topics are considered important:

1. The Python data model

3. Concurrency and asynchronous programming


4. Functions and related tips
5. How to design an OOP system

They are important in different ways.

1. The Python data model and Python classes are fundamentally important as they are
the basics to learn everything else. They are basic but they are not obviously easy to
master. Many Python users, or most Python users didn’t graduate with a computer
science master’s degree. They started using Python by copying and pasting so long as
the code worked. At some point in their learning or career path, the lack of founda-
tion will bite. I want to solidify your foundations.
2. The other four topics are deemed as a gap between so-so engineers and more pro-
fessional engineers. I picked these four because they are the ones that I find easy to
break the cyclic dependencies of the advanced topics. For example, it is impossible
to talk about concepts like fixture without talking about decorators first. It is hard

DOI: 10.1201/9781003316909-1 1
2   ◾    Learning Advanced Python by Studying Open Source Projects

to imagine context manager without talking about the idea of coroutine first: well
technically you can. I try to chop the open source projects that utilize multiple such
concepts into digestible pieces. The example of aiosqlite is probably the most typical
example. Please do read Chapter 5 and let me know whether I did an acceptable job.

The following topics are not considered important enough for most readers.

2. Publishing a Python package

Well, those topics are very important if you are working on fine-tuning Python perfor-
mances: not because of bad code but because of Python itself. For example, some high-
performance computing work requires such skills, but most Python users don’t ever write
a line of C in their whole career. Similarly, most people don’t publish Python packages as
well.
There are great resources on these two topics. I would recommend the official doc for the
former and the book Publishing Python Packages1 by Dane Hillard for the latter. Honestly
speaking, the fact that the second topic is enough for an independent book also makes it
impractical to be included in this book. The first topic is also big enough for an indepen-
dent book.
The following topics are indeed important, but they are not really Python specific.

The first draft of this book included documentation as an independent chapter. Popular
Python open source libraries often have fabulous documentation. However, the more I
wrote about it, the more I feel that they are not advanced Python, they are skills related to
advanced Programming. Everyone who wrote code needs to know them. It is not suitable to
include them in a book about Python.
Similar ideas apply to project management. Since most open source projects are devel-
oped for the public, you can read the comments, the interactions and sometimes spicy
exchanges between developers and users. I personally find this topic super interesting while
preparing the materials. However, they are, again, not Python specific. I have to drop it.
Let’s discuss the purpose of this book. This book’s purpose is to help moderately good
Python users to become professional Python users.
What is a Python user? What is moderately good? What makes a Python user
professional?
A Python user is a superset of a Python developer. When I was a PhD student, I used
Python a lot. I was not a Python developer. Namely, I wrote Python as a tool to do some-
thing else, rather than for the sake of writing Python. On the contrary, a Python devel-
oper’s job is to write high-quality Python applications.
Introduction  ◾    3

However, I find Python users’ work often requires very high technical skills. For exam-
ple, a Jupyter Notebook is far from enough for a researcher. The researchers sometimes
hack their way through the development and write terrible code. This book aims at the
aspirational and ambitious Python users so they can use Python in the most efficient way.
Of course, developers are welcome.
So, what is exactly being moderately good that qualifies you to read this book?
If you

2. are familiar with basic object-oriented programming concepts like class, instance
and inheritance.
3. understand basic operating system concepts like process, thread and memory.
4. are familiar with tools/platforms like Git, GitHub and VS Code.

Then, you are considered moderately good. Sounds easy, right?


What makes a Python user professional? This is important as it is what you will gradu-
ally learn to become while reading this book.
A professional user can, not limited to the list though, perform the following tasks:

1. read code written by others efficiently and correctly.


2. write more robust, elegant and well-tested Python code.
3. have a deep understanding of Python’s data model and use it appropriately.
4. know how to design an OOP system and turn it into reality.

I hope this gives a good idea of what topics this book covers, and what kind of prerequisites
I am expecting the readers to have.

OVERVIEW OF THE APPROACH TAKEN


One of the biggest features of this book is that it is not written in a textbook style. Instead,
it is written somewhat like a novel as long as the circumstance permits.
In a textbook, the author introduces the concepts, then the theorems, then the solved
examples, followed by exercises.
In a novel, a character doesn’t get on the stage until it is time for the character. The plot
has its own rhythm, and characters have natural development paths.
In this book, concepts and best practices are not introduced until it becomes evident
and obvious that they are absolutely needed. For example, the idea of mixin is not intro-
duced until we find the class relationship in scikit-learn becomes error-prone and unman-
ageable. This is how humans learn. Newton’s laws are not written as a bullet list. They are
discovered after countless observations, experiments and calculations.
4   ◾    Learning Advanced Python by Studying Open Source Projects

Here is another more detailed example.


You want to write a test that tests whether the tested function writes some output to the
screen. You are not sure how to do it so you Google it.
Google returns some links and you click in. Several pages mention the idea of monkey
patch but the code examples in the StackOverflow links are so complex that you can’t use
them directly. You try to read the official docs and it is so long. You try to search on GitHub
but there are decorators on top of decorators with weird syntax. You give up.
What this book offers is a guidance to smoothen the path from the problem to the
answer. I will explain why monkey patch is introduced in testing, what problems it tries to
resolve and how it solves it. I have carefully designed the order of the topics in this book
so you will already have a good grasp of the Python data model before using the, say,
setattr() function doing monkey patching. Then I will show you that the problems you
are facing also exist in the big-name open source projects. We will study how they solve the
problems and the solution to your own problem will be self-revealing.
I do acknowledge that sometimes the order has to be reversed if the example in the open
source project is too complex to absorb at the beginning. I will provide a solution to your
problems first then move on to the open source counterparts.
Again, I am very excited that you picked up this highly experimental book. I hope you
enjoy it and I look forward to your feedback.

NOTE
Chapter 1

The Data Model of Python

A GENTLE INTRODUCTION TO PYTHON’S DATA MODEL


Have you wondered what makes a Python dict a dictionary, and what makes a Python
list a list? In Python, you can perform different kinds of operations on different kinds
of data structures. Take a list, for example, you can append a member to a list, extend
one list with another one and index it with integers. Let’s build a list of cars with code
snippet 1.1.

cars = list()
cars.append(‘bmw’)
cars.extend([‘audi’, ‘toyota’])
assert cars[0] == ‘bmw’
last_car = cars.pop()
assert last_car == ‘toyota’
assert len(cars) == 2

CODE 1.1 Operations on a Python list object.1

For a dictionary, you can perform a different set of operations as shown in code snippet
1.2. You can get a member of the dictionary. Note that both list and dict support the
len() method.

fruit_prices = dict()
fruit_prices[‘apple’] = 0.5
fruit_prices[‘orange’] = 0.25
assert len(fruit_prices) == 2
assert fruit_prices.get(‘pear’) == None

CODE 1.2 Operations with a Python dict object.

What makes lists and dictionaries behave in different ways? What if we want to modify
their behaviors and create a hybrid data structure to suit our needs? This will be the main
topic of this chapter: the data model2 for built-in Python data types.
DOI: 10.1201/9781003316909-2 5
6   ◾    Learning Advanced Python by Studying Open Source Projects

In Python, everything is an instance of the object class. You can think of object as the
ancestor of all things in Python, including the built-in types like int, str, list,
dict and all user-defined classes. Let’s try some examples with code snippet 1.3.

isinstance(“California”,object)
# True

isinstance(int,object)
# True

isinstance(list(),object)
# True

class Car:
pass

isinstance(Car(),object)
# True

isinstance(Car, object)
# True

CODE 1.3 Check the objects’ types with isinstance() function.

A Car instance is an object instance. Also, the Car class itself is an object instance. The
question is that if all stuffs are instances of the object class, then what makes a list dif-
ferent from a dict?
Let’s check the supported methods of a list and a dict.
The dir() function returns a list of attributes and methods supported by an object. We
sort the list in alphabetical order to make it easier to compare the results. Code snippet 1.4
shows the result for a list instance.

sorted(dir(list()))

# [‘__add__’, ‘__class__’, ‘__class_getitem__’, ‘__contains__’,


‘__delattr__’, ‘__delitem__’, ‘__dir__’, ‘__dir__’, ‘__doc__’,
‘__eq__’, ‘__format__’, ‘__ge__’, ...] # skipped

CODE 1.4 The attributes and methods supported by a Python list object.

Let’s check what methods are supported by a list instance but not supported by a dict
instance and vice versa. To do that, we need to build two sets and take a difference as
shown in code snippet 1.5.

set(dir(list())) - set(dir(dict()))
The Data Model of Python  ◾    7

# {‘__add__’, ‘__iadd__’, ‘__imul__’, ‘__mul__’, ‘__rmul__’,


‘append’, ‘count’, ‘extend’, ‘index’, ‘insert’, ‘remove’,
‘reverse’, ‘sort’}

# the other way around

set(dir(dict())) - set(dir(list()))
# {‘__ior__’, ‘__or__’, ‘__ror__’, ‘fromkeys’, ‘get’,
‘items’, ‘keys’, ‘popitem’, ‘setdefault’, ‘update’, ‘values’}

CODE 1.5 Compare the differences of supported methods for a list and a set.

You may notice that both list and set support the __gt__ methods. It means that you
can compare two lists or two dictionaries. It seems that they follow the same protocol here
that defines what they can do: they can be compared against their own kinds.
However, a list supports the __add__ method while a dict instance does not. This
hints that they follow different protocols: lists can be added directly, while dictionaries
cannot.
In the following sections, you will learn how to create your own data structures that fol-
low different protocols and control exactly how they behave.

CUSTOMIZED COMPARISON
Let’s begin with a scenario. You are hired by a major car dealer to create an application that
will help them to keep track of their customers’ information. One key feature of the applica-
tion is to compare the in-house creditability of customers. For example, if two customers
bid for the same car, the application needs to tell your boss which customer is more credible.
We need a Customer class. Code snippet 1.6 creates it.

class Customer:
def __init__(self, first_name: str, last_name: str, credit_
score: int, credit_limit: int, in_debt: bool, monthly_income: int):
self.first_name = first_name
self.last_name = last_name
self.credit_score = credit_score
self.credit_limit = credit_limit
self.in_debt = in_debt
self.monthly_income = monthly_income

def __repr__(self):
debt_status = “not in debt” if self.in_debt == False else
“in debt”
return f”Customer {self.first_name} {self.last_name},
{debt_status},” \
f” with a credit score of {self.credit_score},”\
f” credit limit of {self.credit_limit}” \
f” and a monthly income of {self.monthly_income}.”
Visit https://textbookfull.com
now to explore a rich
collection of eBooks, textbook
and enjoy exciting offers!
8   ◾    Learning Advanced Python by Studying Open Source Projects

f”with a credit score of {self.credit_score},”\


f”credit limit of {self.credit_limit}” \
f”and a monthly income of {self.monthly_income}.”

CODE 1.6 The Customer class.

The __repr__ method is used to print the object. If you don’t define it, Python will print
the object’s memory address like < __main__.Customer object at0x1083c4ee0>.
We can create a few customers and play around with them as shown in code snippet 1.7.

john_smith = Customer(“John”, “Smith”, 800, 200000, False, 10000)


richard_dawkins = Customer(“Richard”, “Dawkins”, 700, 240000,
True, 8000)
albert_jackson = Customer(“Albert”, “Jackson”, 700, 250000, True,
12000)
melissa_miller = Customer(“Melissa”, “Miller”, 700, 250000, False,
9000)

print(melissa_miller)
# Customer Melissa Miller, not in debt, with a credit score of
700, credit limit of 250000 and a monthly income of 9000.

CODE 1.7 Create a few customers and print one out.

To compare the financial credibility of the customers, the car dealer has created a set of
rules based on their historical experiences. The rules are organized in order such that the
rules are checked in order. These rules are:

1. The customer with a higher credit score is more credible.


2. When credit scores are equal, the customer with a higher credit limit is more credible.
3. When both are equal, the customer with a higher monthly income is more credible.

However, if the one who gets paid higher is in debt while another who gets paid lower is
not, the difference of monthly income must be larger than 4000. Otherwise, the one who
is not in debt is more credible.
Ideally, we want to compare the john _ smith and richard _ dawkins objects in
code snippet 1.8. However, we can’t do it because Customers don’t support such operations.

john_smith < richard_dawkins


# Traceback (most recent call last):
# File “FILE_PATH”, line 25, in <module>
# john_smith < richard_dawkins
# TypeError: ‘<’ not supported between instances of ‘Customer’ and
‘Customer’

CODE 1.8 Comparison is not supported for the Customer class.


The Data Model of Python  ◾    9

We have two solutions. One is to write a helper function that compares two customers.
Every time we need to compare customers, we can pass the function to something like the
key parameter of the sort() method. Another solution is to enable native support for
Customer comparison.

Which solution is better? The logic of comparison needs to go somewhere in the code. The
question is where. The canonical way is in the Customer class. There are two reasons. First,
by enabling syntax like john _ smith < richard _ dawkins, we aligned our syntax with
the Pythonic way of doing comparison. It is much easier for your coworkers to integrate the
code into their projects. Second, the built-in comparison logic is more robust and error-free
than a standalone function. When you ship your code to someone else, you have a better
control over the code unless the code users deliberately overwrite the comparison logic in
the Customer class, which is much less likely than them writing another standalone com-
parison function.

Let’s pause our concerns for a while to learn from the pros and see how this is done in
the SymPy library. SymPy is an open source Python library for symbolic computation.
It can be used to perform algebraic computations and symbolic differentiation, etc. Code
snippet 1.9 shows a differentiation example.

import sympy as sym


x = sym.symbols(“x”)
print(type(x))
# <class ‘sympy.core.symbol.Symbol’>
print(sym.diff(x**2+sym.sin(x) + 2*x,x))
# 2*x + cos(x) + 2

CODE 1.9 Use SymPy to calculate the derivative of a function.

In snippet 1.9, we defined a symbol x and differentiated the expression x 2 + sin( x ) + 2 x,


the result is correct: 2 x + cos ( x ) + 2.
Like our cases, customized comparisons are also common in SymPy. For example, a
polynomial’s terms can be arranged in any order, but the polynomial remains the same.
We would love to enable such mathematical expression comparison.
In Python, magic methods or dunder methods like __lt__ and __ge__ define how
comparisons are done. The first stands for less than, and the latter stands for greater than
or equal to. Redefining them, in other programming languages, is often called operating
overloading.

Dunder is an abbreviation of double underscore if you are wondering.

Back to SymPy, instead of studying its implementation, let’s investigate a bug to pierce
into its core. The developers found a bug that alternating two objects’ order in comparison
10   ◾    Learning Advanced Python by Studying Open Source Projects

gives different results in early 2021. As stated in issue 20796,3 the two comparisons in code
snippet 1.10 should both return False. Based on the types of them, one represents numeri-
cal value and another logical. Objects with different data types should always be different.

from sympy import S

S(0.0) == S.false
# True

S.false == S(0.0)
# False

CODE 1.10 Singleton comparisons in SymPy.

S here stands for Singleton. S.false means that there is only one such thing as a math-
ematical false in the whole mathematical universe. There can only be one false and there
can only be one 0.

In object-oriented programming, a singleton is a design pattern that restricts the instantiation


of a class to a single instance and ensures that there is a global point of access to that instance.
S.EmptySet is a singleton example that represents THE mathematical empty set. It is
handy to use a singleton object to represent a special value in mathematics because this empty
set is just that empty set, there are no two different empty sets nor two different infinities.

Now, let’s get to the implementation of the __eq__ method of the S class. Pull request
208014 fixed the issue but I already copied the pre-PR implementation to snippet 1.11.
In snippet 1.11, the self represents a float number.

def __eq__(self, other):


from sympy.logic.boolalg import Boolean
try:
other = _sympify(other)
except SympifyError:
return NotImplemented
if not self: # comment 1
return not other
if isinstance(other, Boolean): # comment 2
return False
if other.is_NumberSymbol:
if other.is_irrational:
return False
return other.__eq__(self)
if other.is_Float:
# comparison is exact
# so Float(.1, 3) != Float(.1, 33)
The Data Model of Python  ◾    11

return self._mpf_ == other._mpf_


if other.is_Rational:
return other.__eq__(self)
if other.is_Number:
ompf = other._as_mpf_val(self._prec)
return bool(mlib.mpf_eq(self._mpf_, ompf))
return False # Float != non-Number

CODE 1.11 Equality comparison of a float number with a bool, before pull request
20801.

The __eq__ method takes two arguments, the first one is the object itself and the second
one is the object to be compared with. When you write comparison like A == B, The __eq__
method of the object on the left side of the comparison is called: in the example, A.
In the line denoted with comment 1, we first check the Boolean representation of the
object itself. If it is False, it means the object is a 0, probably with arbitrary precision. In that
case, we check the other object. If it is also equivalent to 0, then they are equal.
In the line denoted with comment 2, we check whether the other object is a Boolean
object or not. If it is, then we always return False. A number is never the same with a
Boolean, mathematically.
A quick note if you are not catching up. How did we know that the float number’s __eq__
method is wrong? Since S.false == S(0.0) gives the correct answer, which is False, we
then know the S.false. __eq __(S(0.0)) returns the right answer. This is how we know
that the issue is in the implementation of __eq__ for the float number Singleton object.
The devil lies in the order of the two lines I commented. When a float number is equiva-
lent to 0, not self in the first if statement is evaluated to be True, therefore if the other object
is a False object, a True value is returned. These two if statements need to be switched. If
the types are different, then they are never equivalent. This is exactly what the pull request
20801 fixes.
Notice that the practice is very similar to our proposed implementation of __lt__
or __gt__ methods for the Customer class. The order of criteria matters.
Go back on our original question, code snippet 1.12 is implements the __lt__ method
for the Customer class. It is probably the most elegantly written code. In production,
make sure you write comprehensive tests, too.

def __lt__(self, other):


income_threshold = 4000
if self.credit_score != other.credit_score:
return self.credit_score < other.credit_score

if self.credit_limit != other.credit_limit:
return self.credit_limit < other.credit_limit
income_diff = abs(self.income - other.income)

if self.monthly_income < other.monthly_income:


12   ◾    Learning Advanced Python by Studying Open Source Projects

if not self.in_debt and other.in_debt:


return income_diff > income_threshold
return True
elif self.monthly_income > other.monthly_income:
if self.in_debt and not other.in_debt:
return income_diff < income_threshold
return False
else:
return False

CODE 1.12 Implementation of the less than logic for Customer class.

This dunder method allows users to sort customers natively as shown in code snippet 1.13.

john_smith > richard_dawkins


# True

sorted([john_smith, richard_dawkins, albert_jackson, melissa_


miller])[0] == albert_jackson
# True

CODE 1.13 Customer instances can be compared directly now.

So far everything looks great. Let’s do something even fancier in the next section.

A MANAGED ITERATION BEHAVIOR


Summarizing our first lesson, we get a taste that Python objects, whether built-in or user-
defined, can implement or fulfill different protocols.
I am being a little lazy with words here to deviate the definition of protocol from a rig-
orous computer science sense. It basically means a set of rules that defines the behaviors
of an object. For example, if you define a Customer class with a method change _
credit _ limit(), then we have a rule that says that a Customer object can change its
credit limit without caring much how it is implemented.
Python’s built-in data structures implement different protocols. The collections.
abc5 module provides abstract base classes for containers that obey a set of protocols. Here
are a few examples from this module.

1. Sequence: a sequence is a sequence of members.


2. MutableSequence: a sequence whose members can change.
3. Mapping: immutable map from keys to values.
4. MutableMapping: a Mapping that the mapping relationship can be changed.
Random documents with unrelated
content Scribd suggests to you:
»Anteeksi, miss Wade. Minä olen yksin.»

»Se nimi, joka minulle äsken ilmoitettiin, ei ollut teidän.»

»Ei, tiedän sen. Suokaa anteeksi. Olen jo kokenut, ettei minun


nimeni ole omiaan hankkimaan minulle pääsyä teidän puheillenne, ja
sentähden rohkenin mainita sen henkilön nimen, jota paraillaan
etsin.»

»Anteeksi», vastasi toinen osoittaen niin kylmäkiskoisesti erästä


tuolia, että Clennam jäi seisomaan, »minkä nimen mainitsitte?»

»Mainitsin nimen Blandois.»

»Blandois?»

»Nimen, jonka te kyllä tunnette.»

»Omituista», sanoi nainen rypistäen otsaansa, »että te


itsepintaisesti ja asianomaisen sitä haluamatta osoitatte
mielenkiintoa minua ja tuttavuuksiani, minua ja asioitani kohtaan, mr
Clennam. En ymmärrä, mitä tarkoitatte.»

»Anteeksi. Tunnetteko sen nimen?»

»Mitä se nimi teihin kuuluu? Mitä teillä on sen kanssa tekemistä?


Liikuttaako se teitä, tunnenko vai enkö tunne jotakin nimeä? Tunnen
monta nimeä ja olen unohtanut vielä useampia. Tämä nimi saattaa
kuulua edellisiin, saattaa kuulua jälkimäisiinkin, mutta voi sattua
niinkin, etten ole milloinkaan kuullut sitä. En tunne mitään syytä,
jonka tähden tutkistelin tai antaisin tutkistella itseäni tässä
suhteessa.»
»Jos sallitte», sanoi Clennam, »niin kerron teille syyn, miksi näin
itsepintaisesti tarraudun tähän asiaan. Myönnän tarrautuvani siihen
ja pyydän hartaasti teitä suomaan anteeksi, että teen niin. Asia
koskee vain minua. En väitä, että se vähääkään liikuttaa teitä.»

»Hyvä, sir», vastasi toinen, kehoittaen uudelleen ja vähemmin


kopeasti Clennamia istumaan; tämä noudatti nyt kehoitusta, kun
emäntä itsekin istuutui. »Olen hyvilläni ainakin siitä, ettei nyt ole
kysymys kenenkään ystävänne valinnanvapautta vailla olevasta
orjattaresta, jonka minä olisin ryöstänyt. Kertokaa nyt syynne, olkaa
hyvä.»

»Ensiksikin, määritelläksemme henkilön, josta puhumme», alkoi


Clennam, »niin sallikaa minun huomauttaa, että hän on sama mies,
jonka te tapasitte Lontoossa joku aika takaperin; muistanette
kohdanneenne hänet virran luona — Adelphissa?»

»Te sekaannutte anteeksiantamattomalla tavalla minun asioihini»,


vastasi nainen katsoen häneen kylmän paheksuvasti. »Mistä tiedätte
tämän?»

»Pyydän, ettette pane sitä pahaksenne. Pelkän sattuman kautta.»

»Minkä sattuman?»

»Vain sen, että näin teidät kadulla ja näin kohtauksenne.»

»Puhutteko omasta näkemästänne vai jonkun muun?»

»Omastani. Näin sen itse.»

»Tapahtuihan se oikeastaan avoimella kadulla», huomautti toinen


miettien ja vähitellen lauhtuen. »Vaikkapa viisikymmentä henkilöä
olisi voinut nähdä sen. Eikä se olisi merkinnyt mitään.»

»En katsokaan sen merkitsevän mitään, että näin tämän


kohtauksen, en myöskään pane sitä yhteyteen käyntini enkä sen
palveluksen kanssa, jota aion pyytää teiltä; se selittää vain
tännetuloni.»

»Ahaa, te aiotte pyytää minulta palvelusta! Minusta tuntuikin», ja


kauniit kasvot kääntyivät katkerina häneen päin, »että käytöksenne
oli muuttunut lempeämmäksi, mr Clennam».

Virkkamatta mitään tyytyi tämä ilmaisemaan vastalauseensa


pelkällä eleellä. Sitte mainitsi hän Blandoisin häviämisestä, josta miss
Wade luultavasti oli kuullut. Ei, vaikka se ehkä saattoikin olla
luultavaa mr Clennamista, mutta hän ei ollut kuullut mitään
sellaisesta. Katsokoon mr Clennam ympärillensä (sanoi hän) ja
päätelköön itse, kuinka paljon yleisiä uutisia saattoi joutua naisen
korville, joka huhujen kierrellessä oli istunut vain täällä, hautoen
mietteitään. Kiellettyään näin tietävänsä asiasta — ja Clennam uskoi
hänen puhuvan totta — kysyi hän, mitä toinen tarkoitti Blandoisin
häviämisellä. Tämän kautta joutui Clennam kertomaan koko jutun
yksityiskohtia myöten ja ilmaisemaan, kuinka tuskaisen välttämättä
hän halusi tietää mihin mies oikeastaan oli joutunut ja haihduttaa ne
synkät epäluulon pilvet, jotka olivat kokoontuneet hänen äitinsä
talon ympärille. Miss Wade kuunteli ilmeisen hämmästyneenä, ja
hänessä saattoi huomata enemmän hillityn mielenkiinnon merkkejä
kuin ennen, mutta tämä mielenkiinto ei kuitenkaan voittanut hänen
pidättyvää, kopeata, umpimielistä käytöstään. Clennamin lopetettua
sanoi hän vain:

»Ette ole vielä sanonut, sir, kuinka tämä kaikki liikuttaa minua ja
minkä palveluksen aiotte pyytää minulta. Tahtoisitteko puhua siitä
nyt?»

»Otaksun», sanoi Arthur yhä koettaen lauhduttaa hänen hallista


käytöstänsä, »että koska olette kanssakäymisessäsään ehkä sanoa
luottavassa kanssakäymisessä — tämän henkilön kanssa —»

»Sanokaa ja otaksukaa minun puolestani mitä haluatte»


huomautti toinen, »mutta minä en allekirjoita teidän otaksumianne,
mr Clennam, enkä kenenkään muunkaan».

»— että koska olette ainakin henkilökohtaisessa kanssakäymisessä


hänen kanssansa», sanoi Clennam muuttaen otaksumansa muotoa
tehdäkseen sen, kuten toivoi, vähemmin pahennusta herättäväksi,
»niin voitte kenties kertoa minulle jotakin hänen entisyydestänsä,
pyrkimyksistään, tavoistaan, tavallisesta asuinpaikastaan tai antaa
minulle pienen viittauksen, jonka johdolla parhaalla menestyksellä
etsisin häntä, joko löytääkseni hänet tai saadakseni selville minne
hän on joutunut. Tätä palvelusta pyydän teiltä ja teen sen tuskaisin
mielin, kuten toivon teidän ottavan huomioon. Jos jostakin syystä
tahdotte määrätä minulle joitakin ehtoja, niin pidän niitä arvossa
tiedustelematta niistä sen enempää.»

»Te satuitte näkemään minut kadulla tämän miehen seurassa»,


huomautti miss Wade kiinnittäen ilmeisesti, Clennamin harmiksi,
huomionsa enemmän omiin mietteisiinsä kuin hänen pyyntöönsä.
»Tunnette siis miehen ennestään?»

»En ennestään, vasta sen jälkeen. En ollut milloinkaan ennen


nähnyt häntä, mutta näin hänet uudelleen samana iltana, jolloin hän
hävisi. Äitini talossa näin hänet. Jätin hänet sinne. Tästä paperista
näette kaikki, mitä hänestä tiedetään.»
Hän ojensi hänelle yhden kappaleen painettuja kuulutuksia, jonka
miss
Wade luki vakavana ja tarkkaava ilme kasvoillaan.

»Tässä on enemmän kuin mitä minä tiedän hänestä.»

Clennamin kasvot ilmaisivat hänen raskaan pettymyksensä, kenties


myöskin epäilystä näiden sanain totuudesta, sillä miss Wade lisäsi
entiseen tylyyn tapaansa: »Te ette usko sitä. Asia on kuitenkin niin.
Mitä henkilökohtaiseen kanssakäymiseen tulee, näyttää siltä kuin sitä
olisi ollut hänen ja teidän äitinne välillä. Ja kuitenkin te sanotte
uskovanne hänen selitystään, ettei hän tiedä enempää siitä
miehestä.»

Näihin sanoihin samoin kuin niitä seuraavaan hymyyn kätkeytyi


niin selvä epäluuloinen vihjaus, että se nosti veren Clennamin
kasvoihin.

»Katsokaas, sir», jatkoi miss Wade mielihyvin iskiessään


toistamiseen, »tahdon olla niin avomielinen kuin vain ikinä haluatte.
Tunnustan, että jos välittäisin maineestani (kuten en tee) tai jos
minulla olisi hyvä nimi suojattavana (jota minulla ei ole, sillä olen
täysin välinpitämätön siitä, pidetäänkö sitä hyvänä vai huonona), niin
katsoisin olevani pahasti häväisty, jos olisin ollut jonkinlaisissa
tekemisissä tämän vekkulin kanssa. Kuitenkaan ei hän milloinkaan
ole astunut minun kynnykseni yli — ei ole milloinkaan istunut
neuvottelemassa minun kanssani puoleen yöhön saakka.»

Hän purki vanhaa katkeruuttaan ja kaunaansa kääntäen sen


kärjen näin Clennamia vasten. Hänen luonteensa mukaista ei ollut
säästää ja sääliä eikä hänellä ollut minkäänlaisia omantunnon
vaivoja.
»Kerron teille varsin kernaasti, että hän on alhainen, rahanahne
konna, että ensin näin hänen maleksivan Italiassa (jossa oleskelin
joku aika takaperin) ja että käytin häntä sopivana välikappaleena
edistämään eräitä silloisia pyrkimyksiäni. Lyhyesti, etujeni mukaista
oli ja minua huvitti — tahdoin tyydyttää erästä voimakasta tunnetta
— palkata palvelukseeni vakoilija, joka rahasta oli valmis tottelemaan
käskyjäni. Palkkasin tämän heittiön. Ja olen varma siitä, että jos
olisin tahtonut tehdä sellaisen sopimuksen, jos olisin kyennyt
maksamaan hänelle kylliksi ja jos hän olisi voinut tehdä sen
pimeässä, ilmijoutumisen vaaratta, olisi hän ottanut kenet hyvänsä
hengiltä yhtä empimättä kuin nyt otti vastaan rahani. Tällainen on
ainakin minun mielipiteeni hänestä, ja huomaan, ettei teidän
suurestikaan eroa siitä. Teidän äitinne ajatus hänestä, otaksun
(noudatan esimerkkiänne ja otaksun yhtä ja toista), oli suuresti
erilainen.»

»Sallikaa minun muistuttaa teille», sanoi Clennam, »että äitini


ensin joutui tekemisiin hänen kanssansa onnettomien liikeasioiden
kautta».

»Onnettomat liikeasiat näyttävät viime kerrallakin saattaneen


hänet yhteyteen miehen kanssa», vastasi miss Wade, »ja liikeaika
näyttää olleen kovin myöhäinen».

»Vihjaatte siis siihen», sanoi Clennam, vääntelehtien


kovakouraisten iskujen sattuessa, jotka jo olivat syvästi
haavoittaneet häntä, »että olisi ollut jotakin —»

»Mr Clennam», keskeytti toinen tyynesti, »huomatkaa, etten puhu


vihjaamalla miehestä. Hän on, sanon sen vielä peittelemättä,
alhainen, rahanahne konna. Otaksun, että sellainen ihminen menee
sinne, missä hänellä on ansion tilaisuutta. Ellen minä olisi tarjonnut
hänelle tällaista tilaisuutta, ette olisi nähnyt meitä yhdessä.»

Clennam pysyi vaiti kiusaantuneena siitä, että miss Wade


alituisesti käänsi hänen katseltavakseen tämän synkän puolen
asiasta, joka herätti puoliksi tukahdutettua vastakaikua hänen
omassa sydämessään.

»Olen puhunut hänestä kuten vielä elossa olevasta», lisäsi miss


Wade, »mutta voipa hän olla jo tieltä raivattukin. En tiedä sitä enkä
väiltäkään siitä. Minä en enää tarvitse häntä.»

Syvään huoaten ja alakuloisen näköisenä Arthur Clennam nousi


hitaasti. Miss Wade ei noussut, vaan sanoi katseltuaan häntä pitkään
ja epäluuloisen tarkkaavasti, huulet vihaisesti yhteenpuristettuina:

»Hän oli rakkaan ystävänne mr Gowanin valiokumppani, eikö


ollutkin?
Miksette pyydä apua rakkaalta ystävältänne?»

Tämän rakkaan ystävän kieltäminen pyöri Arthurin kielellä, mutta


hän tukahdutti sen muistaen entisiä taistelujaan ja päätöksiään ja
vastasi:

»Mr Gowan ei ole nähnyt Blandoisia sen koommin kuin tämä lähti
Englantiin eikä muutenkaan tiedä hänestä mitään. Hän oli vain
satunnainen ulkomailla saatu tuttava.»

»Satunnainen ulkomailla saatu tuttava!» kertasi toinen. »Niin


Rakkaan ystävänne täytyy koettaa huvitella itseään kaikilla
tuttavuuksilla, joita vain on tarjolla, kun ottaa huomioon millainen
vaimo hänellä on. Minä vihaan hänen vaimoansa, sir.» Kiukku, jolla
tämä sanottiin, oli sitä merkillisempi, kun hän tavallisesti esiintyi
erittäin hillitysti, ja se kiinnitti niin Clennamin mieltä, että hän jäi
paikalleen. Se säkenöi hänen mustista silmistään hänen katsoessaan
Clennamiin, se värisi hänen sieraimissaan ja tulisti hänen
hengitystänsäkin; mutta hänen kasvoillaan sitävastoin oli rauhallisen
halveksiva ilme ja hänen asentonsa oli niin tyynen ja ylpeän siro ja
sulava, kuin jos hänen mielentilansa olisi ollut täysin välinpitämätön.

»Voin vain sanoa, miss Wade», huomautti Clennam, »ettei teillä


voi olla mitään syytä sellaiseen tunteeseen, johon ei kukaan muu ota
osaa».

»Voitte, jos tahdotte, kysyä rakkaalta ystävältänne tätä asiata»,


vastasi miss Wade.

»Olen tuskin niin läheisissä suhteissa rakkaan ystäväni kanssa»,


torjui Arthur, päätöksistään huolimatta, »että joutuisin
koskettelemaan tätä asiaa, miss Wade».

»Minä vihaan häntä», vastasi toinen. »Vielä enemmän kuin hänen


vaimoansa, sillä olin kerran kyllin typerä ja kyllin uskoton itselleni
melkein rakastaakseni häntä. Te, sir, olette nähnyt minut vain
jokapäiväisissä tilanteissa, ja uskallan väittää, että pidätte minua
jokapäiväisenä, tavallista hiukan itsepintaisempana naisena. Ette
ymmärrä mitä tarkoitan vihaamisella, ellette tunne minua sen
paremmin; ette voi ymmärtää, ellette tiedä, kuinka huolellisesti olen
tutkinut itseäni ja ympärilläni olevia ihmisiä. Tästä syystä olen
jonkun aikaa tuntenut halua kertoa teille, millaista elämäni on ollut
— en lauhduttaakseni mielipidettänne minusta, sillä en pane sille
mitään arvoa — mutta jotta ymmärtäisitte, ajatellessanne rakasta
ystäväänne ja hänen rakasta vaimoansa, mitä minä tarkoitan
vihaamisella. Annanko teille jotakin, mitä olen kirjoittanut ja
tallettanut luettavaksenne, vai enkö anna?»

Arthur pyysi häntä antamaan Sen. Miss Wade meni lipastolle, avasi
sen ja otti eräästä sisälaatikosta muutaman kokoonkäärityn
paperiarkin. Osoittamatta minkäänlaista sovinnollisuutta, tuskin
kääntyen hänen puoleensa, pikemmin puhuen vain kuvastimellensa
puolustaakseen omaa itsepintaisuuttansa, sanoi hän antaessaan
paperit:

»Tästä saatte nähdä, mitä minä tarkoitan vihaamisella! Mutta siitä


ei sen enempää. Sir, tapaattepa minut asumassa tilapäisesti ja
halvalla jossakin tyhjässä lontoolaisessa talossa tai vuokrahuoneessa
Calaisissa, niin on Harriet aina luonani. Ehkä haluatte tavata häntä
ennenkuin lähdette. Harriet, tule sisään!» Hän huusi tyttöä vielä
toistamiseen. Toisesta kutsusta tuli Harriet, entinen Tattycoram,
sisään.

»Täällä on mr Clennam», lausui miss Wade; »hän ei kuitenkaan


ole tullut sinun tähtesi, hänellä ei ole enää toivoa sinusta. —
Otaksun, että niin on laita nyt?»

»Niin on — minulla kun ei ole minkäänlaista arvo- tai


vaikutusvaltaa.»

»Hän ei ole tullut etsimään sinua, mutta jotakuta hän kuitenkin


etsii.
Hän kysyy sitä Blandoisia.»

»Jonka seurassa näin teidät Strandilla Lontoossa.»


»Jos tiedät hänestä, Harriet, jotakin muuta kuin että hän tuli
Venetsiasta — minkä me kaikki tiedämme — niin kerro siitä vapaasti
mr
Clennamille.»

»En tiedä hänestä mitään muuta», vastasi tyttö.

»Oletteko tyytyväinen?» kysyi miss Wade Arthurilta.

Hänellä ei ollut mitään syytä epäillä heitä; tytön käytös oli niin
luonnollista, että se jo sinänsä olisi ollut vakuuttava, jos hänellä olisi
ollut joitakin ennakkoepäilyksiä. Hän vastasi: »Minun täytyy hakea
tietoja muualta.»

Hän ei ollut juuri vielä silloin lähdössä, mutta oli noussut


seisomaan ennen tytön tuloa, ja tämä nähtävästi luuli hänen aikovan
lähteä. Hän katsoi Clennamiin kiireesti ja kysyi:

»Voivatko he hyvin, sir?»

»Kutka?»

Tyttö keskeytti vastauksensa, joka olisi ollut »he kaikki», vilkaisi


miss Wadeen ja sanoi: »mr ja mrs Meagles».

»Kyllä, kun viimeksi kuulin heistä. He eivät nyt ole kotimaassa.


Heistä puhuttaessa, sallikaa minun kysyä, onko totta, että teidät on
nähty siellä?»

»Missä siellä? Missä joku sanoo nähneensä minut?» kysyi tyttö


luoden jurosti silmänsä alas.

»Katsomassa portin aukosta huvilan puutarhaan.»


»Ei», vastasi miss Wade. »Hän ei milloinkaan ole käynyt siellä.»

»Olette väärässä», väitti tyttö vastaan. »Kävin siellä ollessamme


viime kerralla Lontoossa. Menin sinne eräänä iltapäivänä, kun jätitte
minut yksin. Ja minä kurkistin portilta sisään.»

»Sellaista raukkaa!» huudahti miss Wade äärettömän


halveksivasti. »Senkö verran merkitsevätkin kaikki meidän
keskustelumme, meidän toveruutemme, kaikki entiset valittelusi!»

»Siinä ei ollut mitään pahaa, että kurkistin portilta», sanoi tyttö.


»Näin ikkunoista, ettei perhe ollut kotona.»

»Miksi menit sen talon läheisyyteen?»

»Koska tahdoin nähdä sen. Koska tunsin, että olisi hauskaa taas
nähdä se.»

Katsellessaan molempia toisiaan vastaan kääntyneitä kauniita


kasvoja ymmärsi Clennam, että niiden molempien luonteiden täytyi
herkeämättä raastaa ja kuluttaa toisiansa.

»Oh!» sanoi miss Wade, kylmästi siirtäen katseensa tytöstä, »eri


asia on, jos tahdot nähdä sen paikan, jossa olit elänyt elämäsi ja
josta minä sinut pelastin, koska olit päässyt selville siitä, millaista
elämäsi siellä oli. Mutta onko tämä vilpittömyyttä, onko tämä
uskollisuutta minua kohtaan? Näinkö suhtaudut yhteiseen
asiaamme? Sinä et ole sen luottamuksen arvoinen, jota olen
osoittanut sinulle. Sinä et ole sen ystävällisyyden ja
hyväntahtoisuuden arvoinen, jota olen yhä suonut sinulle. Et ole
koiraa parempi, ja viisainta olisi, että palaisit noiden ihmisten luo,
jotka ovat kohdelleet sinua pahemmin kuin ruoskimalla.»
»Jos puhutte heistä noin vieraan kuullen, niin yllytätte minua
asettumaan heidän puolellensa», sanoi tyttö.

»Palaa heidän luoksensa», tokaisi miss Wade, »palaa heidän


luoksensa».

»Te tiedätte varsin hyvin», kivahti Harriet vuorostaan, »etten palaa


heidän luoksensa. Tiedätte varsin hyvin, että olen luopunut heistä
enkä milloinkaan voi, en tahdo enkä aio palata heidän luoksensa.
Jättäkää siis heidät rauhaan, miss Wade.»

»Pidät heidän yltäkylläisyyttänsä parempana kuin niukempaa


elämääsi täällä», vastasi toinen. »Sinä korotat heitä ja halvennat
minua. Mitäpä muuta olisin voinut odottaa? Minun olisi pitänyt tietää
se jo heti.»

»Asia ei ole niin», intti tyttö, kovasti punastuen, »ja te ette


tarkoita mitä sanotte. Minä tiedän mitä tarkoitatte. Te soimaatte
minua ja annatte salaa minun ymmärtää, ettei minulla ole ketään
muuta, kenen puoleen kääntyä, kuin te. Ja koska minulla ei ole
ketään muuta, kenen puoleen kääntyä, niin arvelette voivanne
pakottaa minut tekemään tai jättämään tekemättä mitä ikinä
tahdotte ja voivanne loukata minua kaikilla tavoin. Olette yhtä paha
kuin hekin, tarkalleen. Mutta minä en tahdo tulla kesytetyksi enkä
tahdo alistua. Sanon vielä kerran, että kävin katsomassa huvilaa,
koska olen usein ajatellut, että tahtoisin nähdä sen vielä kerran.
Kysyn vielä kerran kuinka he voivat, sillä pidin heistä ennen ja uskoin
toisinaan, että he olivat hyviä minulle.»

Tämän jälkeen sanoi Clennam olevansa varma siitä, että he


edelleenkin ottaisivat hänet ystävällisesti vastaan, jos hän vain
joskus haluaisi palata.
»En ikinä!» huudahti tyttö kiihkeästi. »Sitä en milloinkaan tee.
Kukaan ei tiedä sitä paremmin kuin miss Wade, vaikka hän pilkkaa
minua, koska on tehnyt minut riippuvaiseksi itsestään. Ja minä
tiedän niin olevan ja tiedän hänen olevan erittäin tyytyväisen
saadessaan muistuttaa minulle sitä.»

»Varsin taitavasti kudottu valheverkko!» vastasi miss Wade yhtä


kiukkuisesta kopeasti ja katkerasti, »mutta sittekin liian ohut
peittääkseen sitä, minkä selvästi näen tässä. Minun köyhyyteni ei
kestä kilpailussa heidän rahojensa kanssa. Parasta palata heti vain,
parasta palata heti vain, niin pääsee siitä!»

Arthur Clennam katseli heitä heidän seistessään siinä parin


askeleen päässä toisistaan ahtaassa hämärässä huoneessa, kumpikin
kopeasti hellien omaa vihaansa, kumpikin jäykän itsepintaisena
raastaen ja kiusaten omaansa ja toisen sydäntä. Hän mainitsi jotakin
poislähdöstä, mutta miss Wade taivutti vain hiukan päätänsä, ja
Harriet, teeskennellen kurjan orjan ja palvelijan nöyryyttä (mutta
uhkamielisenä silti), oli olevinaan liian alhainen huomattavaksi tai
huomatakseen itse mitään.

Clennam astui pimeitä kiemurtelevia portaita alas pihaan; ja hänen


mieltänsä painoi entistä raskaammin vaikutelma, joka siihen oli
laskeutunut hänen katsellessaan elottoman muurin varjoa, elottomia
pensaita, kuivunutta suihkukaivoa ja särkynyttä kuvapatsasta.
Mietiskellen eri puolilta tässä talossa kuulemaansa ja näkemäänsä
samoin kuin onnistumattomia pyrkimyksiänsä päästä hävinneen
epäilyttävän olion jäljille, palasi Clennam Lontooseen ja Englantiin
samalla laivalla, jolla oli tullutkin. Matkalla avasi hän paperikäärön ja
luki sen, mitä seuraavassa luvussa kerrotaan.
SEITSEMÄSKUUDETTA LUKU

Itsekiduttajan tarina

Onnettomuudekseni en ole typerä. Varhaisesta lapsuudestani


saakka olen keksinyt sen, mitä ympäristöni on luullut salavansa
minulta. Jos minua aina olisi voitu pettää ja pimittää, sen sijaan
että aina pääsin totuuden perille, niin olisin voinut elää yhtä
rauhallista ja rattoisaa elämää kuin useimmat pöllöpäät.

Lapsuuteni kului isoäidin luona, se on: eräs nainen edusti tätä


omaista ja otti itselleen tuon nimen. Hänellä ei ollut oikeutta siihen,
mutta minä — joka kuitenkin olin siinä määrin typerä — en epäillyt
häntä. Hänellä oli luonansa muutama oman perheensä lapsia ja
muutamia vieraita. Kaikki olivat tyttöjä, yhteensä kymmenen minut
mukaan lukien. Me asuimme kaikki yhdessä, ja meidät kasvatettiin
yhdessä.

Lienen ollut noin kaksitoistavuotias, kun aloin huomata kuinka


nämä tytöt kaikin tavoin pyrkivät kohtelemaan minua suojelevasti.
Minulle kerrottiin, että olin orpo. Meidän joukossamme ei ollut
muita orpoja, ja minä huomasin (siinä oli ensimmäinen haitta siitä,
etten ollut typerä), että he olivat minulle ystävällisiä vain
loukkaavasta säälistä, oman ylemmyytensä tunnossa. En luottanut
näihin huomioihin heti harkitsematta. Koettelin heitä usein. Oli
melkein mahdotonta saada heitä riitelemään kanssani. Jos joskus
onnistuin jonkun kanssa, niin saatoin olla varma siitä, että hän
palasi tunnin tai parin kuluttua luokseni ja alkoi lepytellä minua.
Minä ärsytin heitä alituisesti enkä tiedä heidän milloinkaan
odottaneen, että minä alkaisin hieroa sovintoa. He antoivat minulle
aina anteeksi turhamaisuudessaan ja alentuvaisuudessaan.
Aikuisten pienoiskuvia!

Yksi heistä oli minun valittu ystävättäreni. Rakastin tätä typerää


houkkaa intohimoisesti, mitä hän ei ansainnut vähääkään, enkä voi
muistella tätä kiintymystäni tuntematta häpeää, vaikka olinkin lapsi
vain. Hänellä oli, kuten he sanoivat, herttainen ja hellä luonne. Hän
osasi jaella ja jakelikin kauniita katseita ja helliä hymyilyjä
jokaiselle. Luulen, ettei talossa ainoakaan paitsi minua tiennyt, että
hän teki niin loukatakseen ja katkeroittaakseen minun mieltäni!

Kaiken uhallakin pidin tästä arvottomasta tytöstä niin paljon, että


elämäni sen kautta kävi levottomaksi ja myrskyiseksi. Minua
nuhdeltiin ja soimattiin alituisesti siitä että muka »kiusasin» häntä,
toisin sanoen, että nuhtelin häntä hänen uskottomuudestaan ja
itketin häntä, kun näytin osaavani lukea hänen sydämensä
ajatukset. Kaikesta huolimatta rakastin häntä uskollisesti ja kerran
menin hänen kanssaan hänen kotiinsa lomaa viettämään.

Hän oli kotona pahempi kuin koulussa. Hänellä oli joukoittain


serkkuja ja tuttavia, ja meillä oli tanssiaisia hänen kodissaan ja
kävimme tanssiaisissa muiden kodeissa, ja sekä kotona että kylässä
kidutti hän minua sietämättömästi. Hänen pyrkimyksenänsä oli
saada heidät kaikki rakastumaan häneen — tehdäkseen minut
hulluksi mustasukkaisuudesta; hän oli tuttavallinen ja hyvissä
väleissä kaikkien kanssa — tehdäkseen minut hurjaksi kateudesta.
Kun jäimme kahden makuuhuoneeseemme iltaisin, soimasin häntä
ja sanoin selvästi näkeväni hänen mielensä alhaisuuden; ja silloin
hän itki itkemistänsä ja sanoi minua julmaksi, jolloin suljin hänet
syliini pitäen häntä siinä aamuun saakka ja rakastaen häntä yhä
yhtä paljon kuin ennenkin ja tuntien usein, että mieluummin kuin
kärsin sillä tavalla pitelisin häntä sylissäni ja vaipuisin virran
pohjaan — jossa yhä syleilisin häntä senkin jälkeen kun olisimme
molemmat kuolleet.

Mutta tämä loppui, ja minä tunsin helpotusta. Perheessä oli täti,


joka ei pitänyt minusta. Epäilen tokko heistä kukaan piti minusta;
en minä sitä erikoisesti halunnutkaan, sillä sydämeni riippui vain
tuossa ainoassa. Täti oli nuori nainen, jolla oli tapana totisin silmin
tarkata minua. Hän oli häpeämätön nainen ja katseli minua
peittelemättömän säälivästi. Erään tällaisen äsken kuvaamani yön
jälkeen menin kasvihuoneeseen ennen aamiaista. Charlotte (se oli
petollisen nuoren ystävättäreni nimi) oli mennyt alas ennen minua,
ja minä kuulin sisään astuessani tädin puhuvan hänelle minusta.
Jäin paikalleni lehvistön suojaan ja kuuntelin.

Täti sanoi: »Charlotte, miss Wade kiduttaa sinut hengiltä, eikä se


saa jatkua.» Toistan sanasta sanaan, mitä kuulin.

No mitä hän vastasi? Sanoiko hän: »Minähän kidutan hänet


hengiltä, minä kun pidän häntä piinapenkissä ja olen hänen
teloittajansa, vaikka hän joka ilta vakuuttaa pitävänsä minusta
uskollisesti, huolimatta siitä, että hän tietää, kuinka minä kohtelen
häntä?» Sanoiko hän niin? Ei; ensimmäinen muistettava
kokemukseni oli yhtäpitävä sen kanssa, millaiseksi tunsin hänet, ja
entisten kokemusteni kanssa. Hän alkoi nyyhkyttää ja itkeä
(hankkiakseen tätinsä myötätunnon) ja sanoi: »Rakas täti, hänellä
on niin vaikea, onneton luonto; toiset tytöt koulussa, paitsi minua,
koettavat kaikkensa parantaakseen sitä, kaikki me panemme
parastamme.»

Tämän jälkeen täti hyväili häntä, ikäänkuin hän olisi sanonut


jotakin ylevää eikä halpaa ja vilpillistä, ja kannatti edelleen tuota
inhoittavaa teeskentelyä sanomalla: »Mutta kaikella on järjelliset
rajansa, kultaseni, ja minä huomaan, että tämä onneton tyttöparka
tuottaa sinulle herkeämätöntä ja hyödytöntä surua kuin tällainen
muuten hyvä pyrkimys oikeastaan kannattaisi.»

Onneton tyttöparka tuli piilostaan, kuten voitte arvata, ja sanoi:


»Lähettäkää minut kotiin.» En enää sanonut heille kummallekaan
enkä kenellekään koko talossa muuta kuin: »Lähettäkää minut
kotiin, muuten kävelen sinne yksin yötä päivää!» Kun tulin kotiin,
sanoin otaksutulle isoäidilleni, että ellei minua lähetetty
täydentämään kasvatustani jonnekin muualle ennenkuin tuo tyttö
ja kaikki muut palaisivat, polttaisin silmäni heittäytymällä tuleen
mieluummin kuin sietäisin katsella heidän vilpillisiä kasvojansa.

Nyt jouduin nuorten naisten joukkoon, mutta en huomannut


heitä sen paremmiksi. Kauniita sanoja ja kauniita verukkeita, mutta
minä tunkeuduin heidän vilpillisten ajatustensa perille, kun he
ylistelivät ja korottivat itseänsä ja alensivat minua ja huomasin,
etteivät he olleet sen parempia. Ennenkuin erosin heistä, sain
tietää, ettei minulla ollut mitään isoäitiä eikä muitakaan tunnettuja
sukulaisia. Tämä tieto valaisi monta kohtaa sekä menneessä että
tulevassa elämässäni. Sen kautta ymmärsin monta tilaisuutta,
joissa ihmiset vain ylvästelivät ja halveksivat minua muka
kohdellessaan minua hienotunteisesti tai tehdessään minulle
palveluksia.

Erään liikemiehen hoitoon oli sijoitettu pieni pääoma minua


varten. Minusta piti tulla kotiopettajatar. Minusta tuli kotiopettajatar
ja jouduin köyhän aatelismiehen luokse, jolla oli kaksi tytärtä —
pieniä lapsia vielä, mutta vanhemmat tahtoivat, että he kasvaisivat,
jos mahdollista, kotiopettajattaren hoidossa! Äiti oli nuori ja kaunis.
Kohta alussa hän oli kohtelevinaan minua erittäin hienotunteisesti.
Salasin suuttumukseni, mutta tiesin varsin hyvin hänestä olevan
hauskaa tällä tavalla osoittaa, että hän oli minun emäntäni ja että
hän olisi voinut kohdella palvelijaansa toisellakin tavalla, jos olisi
halunnut.

Sanoin, etten osoittanut suuttumustani, enkä tehtykään niin,


mutta minä näytin ymmärtäväni hänen tarkoituksensa siten, etten
tehnyt hänelle mieliksi. Kun hän yritti tyrkyttää minulle viiniä, join
vettä. Jos pöydässä sattui olemaan jotakin herkkua, lähetti hän sen
aina minulle, mutta minä kieltäydyin siitä aina ja söin niitä
ruokalajeja, joita pidettiin halvempina. Näiden epäonnistumisten
avulla torjuin tuikeasti hänen suojelevaisuutensa ja tunsin itseni
riippumattomaksi.

Pidin lapsista. He olivat arkoja, mutta näyttivät olevan taipuvaisia


kiintymään minuun. Talossa oli lapsenhoitaja, punaposkinen
nainen, joka tunkeilevasti teeskenteli ainaista iloisuutta ja
hyväntuulisuutta, hän oli hoitanut molempia lapsia ja saavuttanut
heidän kiintymyksensä ennenkuin minä näinkään heitä. Olisin
melkein voinut tyytyä kohtalooni, ellei tätä naista olisi ollut. Hänen
ovelat temppunsa pysyäkseen lasten suosiossa alituisessa
kilpailussa minun kanssani olisivat eksyttäneet monen minun
asemassani olevan; mutta minä älysin ne alusta alkaen. Sen
varjolla, että hän järjesti huoneitani, palveli minua ja hoiti
puvustoani (jossa kaikessa hän oli erittäin ahkera) oli hän aina
läsnä. Ovelimpia hänen monista tempuistaan oli että hän muka
koetti saada lapsia paremmin kiintymään minuun. Hän ohjasi heitä
minun luokseni, houkutteli heitä minun seuraani. »Tulkaa kiltin miss
Waden luo, tulkaa rakkaan miss Waden luo, tulkaa kauniin miss
Waden luo. Hän pitää teistä paljon. Miss Wade on viisas nainen,
joka on lukenut paljon kirjoja ja voi kertoa teille paljon enemmän ja
hauskempia tarmona kuin minä. Tulkaa kuuntelemaan miss
Wadea.» Kuinka saatoin kiinnittää heidän huomiotansa kun
sydämeni kapinoi noin kömpelöjä juonitteluja vastaan? Kuinka
saatoin ihmetellä, kun näin heidän viattomien kasvojensa
kääntyvän minusta pois ja heidän käsivarsiensa kiertyvän hänen
kaulaansa eikä minun. Hän katsoi silloin minuun, pudisti heidän
kiharansa kasvoiltaan ja sanoi: »He tulevat kyllä pian teidän
luoksenne, miss Wade; he ovat niin viattomia ja helläsydämisiä,
ma'am; älkää olko pahoillanne siitä ma'am -» ja oli
voitonriemuinen.

Vielä toinenkin tapa hänellä oli. Toisinaan kun hän näki näillä
keinoin varmasti syösseensä minut synkän epätoivon mietiskelyihin,
kiinnitti hän lasten huomion siihen, osoittaakseen millainen ero
hänen ja minun välillä oli. »Hiljaa! Miss Wade-parka ei voi hyvin.
Älkää melutko kultaseni, hänen päätänsä kivistää. Tulkaa
lohduttamaan häntä. Tulkaa kysymään joko hän voi paremmin,
pyytäkää häntä rupeamaan levolle. Toivon ettei teillä ole mitään
huolia, ma'am. Älkää olko pahoillanne, ma'am, älkää olko
surullinen!»
Tämä kävi sietämättömäksi. Hänen armonsa, emäntäni, tuli
eräänä päivänä sisään kun olin yksin ja äärimmäisen tietoinen siitä,
etten minä kestäisi tätä. Sanoin hänelle että minun täytyi lähteä
pois, koska en sietänyt tuota naista, Dawesia.

»Miss Wade! Dawe-parka on hyvin kiintynyt teihin, tekisi mitä


tahansa hyväksenne!»

Tiesin edeltäpäin jo, että hän sanoisi niin, olin valmistunut siihen;
vastasin vain, ettei minun sopinut sanoa emäntääni vastaan, minun
täytyi lähteä.

»Toivo, miss Wade», vastasi hän, ja hänen olemukseensa


ilmestyi heti se ylemmyyden sävy, jonka hän tähän asti oli niin
hatarasti salannut, »ettei mikään, mitä olen sanonut tai tehnyt
yhdessäolomme aikana, ole oikeuttanut teitä käyttämään tuota
epämiellyttävää sanaa emäntä. Sen on täytynyt tapahtua aivan
tietämättäni ja tahtomattani. Pyydän, sanokaa mitä se on.»

Vastasin, ettei minulla ollut mitään valittamista emännästä eikä


emännälleni, mutta että minun täytyi lähteä.

Hän epäröi hetkisen, istui sitte viereeni ja laski kätensä minun


kädelleni. Ikäänkuin tämä kunnia olisi voinut hauduttaa mitkä
muistot hyvänsä!

»Miss Wade, pelkään, että olette onneton jostakin syystä, johon


minun
vaikutukseni ei ylety.»

Hymyilin, ajatellen kokemusta, jonka tuo sana toi mieleeni, ja


sanoin:
»Ehkäpä minulla on onneton, vaikea luonne.»

»Sitä en sanonut.»

»Se on helppo tapa selittää mitä hyvänsä», sanoin.

»Saattaa olla, mutta minä en sanonut sitä. Tarkoitin aivan toista.


Mieheni ja minä olemme joskus puhuneet asiasta, kun
ikäväksemme olemme huomanneet, ettette tunne itseänne
kotiutuneeksi luonamme.»

»Kotiutuneeksi? Oh! Te olette niin ylhäistä väkeä, mylady»,


vastasin.

»Onnettomuudekseni tulin käyttäneeksi sanaa, jonka saattaa —


kuten nähtävästi on käynyt — ymmärtää aivan toisin kuin
tarkoitukseni oli.» (Hän ei ollut odottanut minulta tällaista
vastausta, ja hän häpesi sitä.) »Tarkoitan vain, ettette ole tuntenut
itseänne onnelliseksi meidän luonamme. On vaikea ottaa puheeksi
tällaista asiaa, mutta ehkä se kuitenkin olisi mahdollista kahden
nuoren naisen kesken — lyhyesti, olemme pelänneet, että olette
sallinut joidenkuiden perhesuhteiden, joihin ei kukaan voi olla
syyttömämpi kuin te kaivaa mieltänne. Jos niin on, niin sallikaa
meidän hartaasti pyytää, ettette anna niiden katkeroittaa
mieltänne. Miehelläni itsellään oli, kuten yleisesti tiedetään,
aikaisemmin hyvin iäkäs sisar, joka ei ollut hänen laillinen sisarensa,
mutta jota kaikki rakastivat ja kunnioittivat —»

Älysin heti, että he olivat ottaneet minut taloonsa tuon kuolleen


naisen tähden, kuka hän sitte lienee ollut, voidakseen mahtailla
minulle ja käyttää minua hyödykseen; älysin, että tämä tieto yllytti
lastenhoitajaa pistelemään minua, kuten hän oli tehnyt, ja niinikään
älysin, että lasten arkuus ja pelokkuus epämääräisesti viittasi
siihen, etten ollut muiden ihmisten kaltainen. Läksin talosta samana
iltana.

Parin lyhytaikaisemman ja jotenkin samanlaisen kokemuksen


jälkeen, joista ei nyt kannata puhua, jouduin toiseen perheeseen;
täällä minulla oli vain yksi oppilas, viisitoistavuotias tyttö, talon
ainoa tytär. Vanhemmat olivat iäkkäänpuoleisia, arvossapidettyjä,
rikkaita ihmisiä. Muuan sisarenpoika, joka oli kasvatettu heidän
perheessänsä, vieraili usein talossa, jossa muutenkin kävi paljon
vieraita, ja hän alkoi osoittaa huomaavaisuutta minulle. Torjuin
päättävästi hänen kohteliaisuutensa, sillä taloon tullessani olin
varmasti päättänyt, etten sallisi kenenkään osoittaa minulle sääliä
ja alentuvaisuutta. Mutta hän kirjoitti minulle kirjeen. Se johti
siihen, että menimme kihloihin.

Hän oli vuotta nuorempi kuin minä ja näytti vieläkin


nuoremmalta. Hän oli lomalla Intiasta; siellä hänellä oli toimi, jonka
piti pian muuttua hyvin edulliseksi. Kuuden kuukauden päästä piti
meidän mennä naimisiin ja matkustaa Intiaan. Minun oli määrä
jäädä taloon ja siellä viettää hääni. Kellään ei ollut muistuttamista
tätä järjestelyä vastaan.

En voi välttää sanomasta, että hän ihaili minua, mutta jos voisin,
niin välttäisin. Turhamaisuudella ei ole mitään osaa tässä, sillä
hänen ihailunsa kiusasi minua. Hän ei vaivautunut salaamaan sitä,
niin että minusta tuntui, eläessäni noiden rikkaiden ihmisten
loukossa, kuin hän olisi ostanut minut ulkomuotoni tähden ja
asettaisi ostamansa tavaran näytteille puolustaakseen kauppaansa.
Huomasin, että he mielessään arvioivat minua ja olivat uteliaita
tietämään minkä arvoinen oikeastaan olin. Päätin, etteivät he saisi
sitä tietää. Olin liikkumaton ja vaiti heidän seurassaan ja olisin
sallinut kenen hyvänsä tappaa minut mieluummin kuin olisin
millään tavoin vaivautunut saavuttaakseni heidän hyväksymisensä.

Hän sanoi, etten minä tehnyt itselleni oikeutta. Minä väitin


vastaan ja huomautin, että koska juuri tarkoitin tehdä näin
viimeiseen hetkeeni saakka, niin en voinut alentua mielistelemään
ketään heistä. Hän oli pahoillaan, vieläpä loukkautunutkin, kun
lisäsin toivovani, ettei hän panisi tunteitaan näytteille heidän
läsnäollessaan; mutta hän lupasi uhrata rakkautensa vilpittömät
ilmaisut minun mielikseni.

Tämän varjolla alkoi hän nyt mitata takaisin minulle. Hän saattoi
tuntimäärin pysyä poissa kenen muun kanssa hyvänsä. Istuin
kerran puolen iltaa yksin ja huomaamattomana, jolla välin hän
keskusteli nuoren serkkunsa, oppilaani, kanssa. Näin koko ajan
ihmisten silmistä, että heidän mielestänsä nämä kaksi paljoa
paremmin sopivat yhteen kuin hän ja minä. Arvaten ihmisten
ajatukset istuin ja katselin nuorta paria, kunnes huomasin, että se
saattoi minut naurettavaksi, ja raivosin itseäni vastaan, koska olin
rakastanut häntä.

Sillä minä olin rakastanut häntä. Huolimatta siitä, ettei hän


ansainnut sitä eikä ajatellut niitä tuskia, joita se tuotti minulle —
joiden tuskien olisi kiitollisuuden siteillä pitänyt liittää hänet minuun
elämän iäksi — minä tosiaan rakastin häntä. Hänen tähtensä koetin
sietää, että hänen serkkunsa ylisteli häntä ja teeskenteli luulevansa
sen ilahduttavan minua, vaikka hyvin tiesi, kuinka se raastoi
sydäntäni. Istuessani sulhaseni seurassa muistellen kaikkia
kärsimiäni loukkauksia ja vääryyksiä ja punniten, eikö olisi viisainta
paeta tykkänään talosta eikä enää milloinkaan nähdä häntä —
silloinkin rakastin häntä.

Hänen tätinsä (emäntäni, suvainnette muistaa) lisäsi harkitusti ja


tahallaan koettelemuksiani ja ikävyyksiäni. Erikoisen hauskaa oli
hänestä lavealti kuvitella ja kuvailla tulevaa elämäämme Intiassa,
kuinka järjestäisimme taloutemme ja keiden kanssa
seurustelisimme, sittenkun hän olisi saanut virkaylennystä. Minun
ylpeyteni nousi tätä julkeata tapaa vastaan, jolla hän kuvasi
elämääni naimisissa vastakohdaksi nykyiselle riippuvaiselle ja
halvalle asemalleni. Hillitsin suuttumukseni, mutta osoitin hänelle,
että käsitin täydellisesti hänen tarkoituksensa, ja maksoin hänen
kiusantekonsa teeskentelemällä nöyryyttä. Sanoin hänelle, että
hänen kuvailemansa elämä varmaan oli aivan liian suuri kunnia
minulle. Pelkäsin muka, etten kykenisi mukautumaan niin suureen
muutokseen. Ajatella, että hänen tyttärensä kotiopettajatar joutuisi
näin korkeaan asemaan! Hän nolostui ja he kaikki nolostuivat, kun
minä vastasin tällä tavalla. He huomasivat, että minä täydellisesti
ymmärsin hänen tarkoituksensa.

Näihin aikoihin, jolloin huoleni olivat suurimmillaan ja jolloin olin


pahimmin vihoissani kihlatulleni hänen kiittämättömyydestään, hän
kun varsin vähän välitti niistä lukemattomista ikävyyksistä ja
nöyryytyksistä, joita sain kärsiä hänen tähtensä, näihin aikoihin
alkoi rakas ystävänne mr Gowan käydä talossa. Hän oli siellä vanha
tuttu, mutta oli ollut ulkomailla. Hän ymmärsi tilanteen yhdellä
silmäyksellä ja ymmärsi myös minut.

Hän oli ensimmäinen tapaamani ihminen, joka ymmärsi minut.


Hän ei ollut käynyt talossa kolmea kertaa, ennenkuin huomasin,
että hän seurasi jokaista mieleni liikettä. Näin sen selvästi siinä
kylmän huolettomassa tavassa, jolla hän kohteli heitä kaikkia ja
minua ja koko asiaa. Näin sen selvästi hänen keveästi
vakuuttaessaan ylenmäärin ihailevansa tulevaa puolisoani,
innostuneena puhuessaan kihlauksestamme ja
tulevaisuudentoiveistamme, onnitellessaan meitä vastaisen
rikkautemme johdosta ja alakuloisesti viitatessaan omaan
köyhyyteensä — mikä kaikki tapahtui yhtäläiseen onttoon,
virnistelevään, pilkalliseen tapaan. Tunsin itseni yhä
katkerammaksi, yhä halveksittavammaksi, kun hän esitti kaikki
minua ympäröivät olosuhteet uudessa, vihattavassa valossa,
samalla teeskennellen kuvailevansa niitä parhaassa valaistuksessa
minun ja itsensä ihailtaviksi. Hän oli kuin valepukuinen kuolema
hollantilaisessa maalaustaiteessa: ottipa hän minkä hyvänsä
käsivarrelleen, nuoruuden tai vanhuuden, kauneuden tai
rumuuden, ja tekipä hän sen kanssa mitä tahansa, tanssi tai lauloi,
leikki tai rukoili, aina muutti hän sen aaveeksi.

Ymmärrätte siis, että kun rakas ystävänne onnitteli minua, lausui


hän todellisuudessa säälivänsä minua; kun hän lohdutteli minua
ollessani suutuksissa, paljasti hän vain vertavuotavat haavani, ja
kun hän selitti, että uskollinen nuori ritarini oli »maailman
rakastunein nuorukainen, jolla oli mitä lämpimin sydän», niin hän
vain kosketteli vanhaa epäluuloani, että olin joutunut
naurunalaiseksi. Nämä eivät olleet erikoisen hyviä palveluksia,
sanonette. Minulle ne sopivat hyvin, sillä ne olivat minun oman
mieleni vastakaikua ja vahvistivat omia havaintojani. Pian aloin
viihtyä rakkaan ystävänne seurassa paremman kuin kenenkään
muun.

Huomatessani (kuten tein melkein heti), että tämä herätti


mustasukkaisuutta, viihdyin vieläkin paremman tässä seurassa.
Enkö minä ollut kärsinyt lemmenkateutta, ja yksin minunko osalleni
sellaisen piti langeta? Ei. Tuntekoon hänkin, mitä se oli! Olin iloinen
siitä, että hän saisi kokea sitä, kokea sitä oikein kipeästi, ja toivoin,
että se tuntuisi todella kipeältä. Kirvelevän kipeältä. Hän oli kovin
kesy mr Gowanin rinnalla, joka ymmärsi kohdella minua
vertaisenaan ja osasi eritellä ja arvostella ympärillämme olevia
kurjia ihmisiä.

Tätä jatkui, kunnes täti, emäntäni, otti puhuakseen minun


kanssani. Asiaan tuskin kannatti kajota, hän kun tiesi, etten
tarkoittanut mitään, mutta hän tahtoi kuitenkin omasta puolestaan
vihjata (hän tiesi, ettei muuta tarvittu), että olisi parempi, jos
hiukan vähemmin seurustelisin mr Gowanin kanssa.

Kysyin häneltä, kuinka hän saattoi vastata puolestani. Hän saattoi


aina vastata siitä, etten tarkoittanut mitään väärää, vastasi hän.
Kiitin, mutta sanoin mieluummin vastaavan! itse puolestani ja
itselleni. Hänen muut palvelijansa olisivat luultavasti kiitollisia
hyvästä todistuksesta, mutta minä en tarvinnut sellaista.

Keskustelua jatkui, ja sain aiheen kysyä, kuinka hän tiesi


tarvitsevansa vain vihjata saadakseen minut tottelemaan.
Syntyperänikö vai palvelija-asemani perusteella? En ollut myynyt
itseäni sieluineni ruumiineni. Hän näytti arvelevan, että hänen
hieno sisarenpoikansa oli käynyt orjamarkkinoilla ja ostanut
itselleen vaimon.

Asia olisi luultavasti ennemmin tai myöhemmin päättynyt tällä


tavalla, mutta hän sai sen ratkeamaan nyt yhdellä kertaa. Hän
sanoi minulle, teeskennellen sääliä, että minulla oli onneton, vaikea
luonne. Kuullessani taas toistettavan tätä vanhaa, häpeämätöntä
vääryyttä en kestänyt enää, vaan sanoin kaikki, mitä olin tiennyt
hänestä ja nähnyt hänessä, ja kaikki, mitä olin kärsinyt siitä saakka,
kun olin alentunut olemaan kihloissa hänen sisarenpoikansa
kanssa. Sanoin hänelle, että mr Gowan oli ainoa lohdutukseni
alennustilassani, että olin sietänyt sitä liian kauan ja että pudistin
sen hartioiltani liian myöhään, mutta etten tahtonut enää tavata
ketään heistä. Enkä tavannutkaan.

Rakas ystävänne seurasi minua pakopaikkaani ja piti hyvin


hauskaa purkautuneen kihlauksen kustannuksella, vaikka: hän
samalla oli pahoillaan noiden kelpo ihmisten tähden (he olivat
laatuaan parhaita, joita hän milloinkaan oli tavannut), ja surkutteli,
että niin vähäinen rikos sai näin ankaran rangaistuksen. Ennen
pitkää vakuutti hän, ja se oli todempaa kuin silloin luulinkaan, ettei
hän ollut näin lahjakkaan ja lujatahtoisen naisen arvoinen; mutta —
no niin, no niin!

Rakas ystävänne huvitti minua ja huvitti itseänsä niin kauan, kuin


se miellytti häntä, ja sitten muistutti minulle, että molemmat
olimme maailmaa kokeneita ihmisiä, ettei ollut olemassa mitään
sellaista kuin runollisuus ja romantiikka, että me kumpikin olimme
valmiit kulkemaan omaa tietämme etsien onneamme, kuten
järkevät ihmiset ainakin, ja että molemmat tiesimme kohtaavamme
toisemme maailman parhaina ystävinä, milloin tapaisimmekin. Niin
hän sanoi, enkä minä väittänyt vastaan.

Ei kulunut pitkää aikaa kun sain tietooni, että hän kosiskeli


nykyistä vaimoansa ja että tämä oli viety ulkomaille hänen
ulottuvillaan. Vihasin tätä naista silloin yhtä paljon kuin nytkin, ja
sentähden en tietysti voinut toivoa parempaa kuin että hän menisi
naimisiin rakkaan ystävänne kanssa. Mutta minä olin
vastustamattoman utelias näkemään hänet — niin utelias, että
tunsin sen kuuluvan niihin harvoihin asioihin, jotka enää voivat
tuottaa minulle huvia. Matkustelin hiukan, matkustelin, kunnes
jouduin hänen seuraansa ja teidän. Siihen aikaan ette luultavasti
vielä tuntenut rakasta ystäväänne ettekä vielä ollut saanut häneltä
niitä erinomaisia ystävyydenosoituksia, jotka myöhemmin tulivat
osaksenne.

Tässä seurassa kohtasin tytön, jonka asema monessa suhteessa


merkillisesti muistutti omaani ja jonka luonteessa minun oli
mielenkiintoista ja hauskaa löytää samaa kapinoimista kuin olen
kertonut itsessänikin asuvan pöyhistelevää mahtailemista ja
itsekkäisyyttä vastaan, joille ominaisuuksille annetaan kaikenlaisia
kauniita nimiä, kuten hyvyys, lempeys, suojelus, suopeus ja niin
edespäin. Niinikään kuulin usein sanottavan, että hänellä oli
»onneton luonne». Hyvin ymmärtäen, mitä tarkoitettiin tuolla
mukavalla lauseella, ja koska tarvitsin toveria, joka oli kokenut
samaa kuin minä, päätin koettaa vapauttaa hänet hänen
orjuudestaan ja alennuksestaan. Minun ei tarvitse kertoa, että
menestyin tässä.

Siitä saakka olemme eläneet yhdessä ja jakaneet pienet varani.


KAHDEKSASKUUDETTA LUKU

Ken tuolta rientää iltamyöhään?

Arthur Clennam oli tehnyt tuloksettoman Calaisin-matkansa


kiireisellä työajalla. Muuan raakalaisvalta, joka omisti huomattavia
alueita maailmankartalla, tarvitsi palvelukseensa pari insinööriä,
jotka olivat sukkelia tekemään keksintöjä ja tarmokkaita
toteuttamaan niitä: käytännöllisiä miehiä, jotka kykenivät parhaista
tarjolla olevista aineksista valitsemaan hyvän älynsä kulloinkin
tarpeellisiksi katsomat miehet ja välineet ja jotka olivat yhtä rohkeita
ja aikaansaapia käyttämään välineitänsä päämääriensä
saavuttamiseen kuin suunnittelemaan näitä päämääriä. Tämä valta,
raakalaisvalta kun oli, ei ymmärtänyt työntää suurta isänmaallista
yritystä verukeviraston kätköihin, samoin kuin väkevä viini piilotetaan
päivänvalolta kellariin, kunnes sen hehku ja voima on väljähtynyt ja
kunnes viinitarhan työmiehet ja rypäleiden pusertajat ovat
maatuneet maan tomuksi. Kuvaavan tietämättömänä se toimi,
päättävästi ja tarmokkaasti, »kuinka-se-on-tehtävä»-periaatteen
mukaisesti eikä osoittanut vähintäkään kunnioitusta suurta valtiollista
»kuinka-se-ei-ole-tehtävä»-tiedettä kohtaan tai millään tavalla
kannattanut sitä. Sillä oli todella raakalaismainen tapa riistää kaikki
arvo viimemainitulta salaperäiseltä taidolta jokaisen valistuneen
henkilön silmissä, joka joskus oli harjoittanut sitä.

Tästä johtui, että tarvittavia miehiä etsittiin, ja sellaisia löytyi


myös, mikä sekin oli kovin sivistymätöntä. Ja kun miehet sitte
löytyivät, kohdeltiin heitä erinomaisen luottavasti ja kunnioittaen
(mikä taas todisti typerää valtiollista tietämättömyyttä) ja kutsuttiin
kohta tulemaan ja ryhtymään tehtävään. Lyhyesti, heitä pidettiin
miehinä, jotka aikoivat tehdä sen; he olivat yhteistyössä miesten
kanssa, jotka aikoivat saada sen tehdyksi.

Daniel Doyce oli yksi näitä valittuja. Sillä kertaa ei voitu sanoa,
viipyisikö hän poissa kuukausia vai vuosia Hänen
matkavalmistuksensa ja heidän yhteisen liikkeensä kaikkien
yksityisseikkojen ja tulosten tunnontarkka järjestely vaati paljon
työtä lyhyessä ajassa, ja Clennam ahersi yöt päivät. Ensimmäisenä
lomapäivänään livahti hän Kanaalin poikki ja yhtä nopeasti taas
samalla laivalla takaisin sanomaan hyvästi Doycelle.

Tarkkaan ja huolellisesti näytti hän nyt tälle heidän raha-asiainsa


tilan, heidän voittonsa ja tappionsa, velkansa ja saatavansa. Daniel
tarkasti kaikki kärsivälliseen tapaansa ja ihaili kaikkea suuresti. Hän
tutki tilejä aivan kuin ne olisivat olleet monin verroin nerokkaampi
koneisto kuin mitä hän milloinkaan oli pannut kokoon ja seisoi sitten,
lykkien hattua edestakaisin päässänsä ja katsellen ikäänkuin
vaipuneena ihmeellisen koneen tarkasteluun.

»Se on kaunista, Clennam, säännöllisyydessään ja


järjestyksessään.
Mikään ei voi olla selvempää. Mikään ei voi olla paremmin
suoritettu.»

You might also like