File: tablerow.py

package info (click to toggle)
python-casacore 3.7.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,492 kB
  • sloc: python: 4,170; cpp: 1,549; makefile: 68
file content (155 lines) | stat: -rw-r--r-- 5,694 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# tablerow.py: Python tablerow functions
# Copyright (C) 2006
# Associated Universities, Inc. Washington DC, USA.
#
# This library is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or (at your
# option) any later version.
#
# This library is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
# License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this library; if not, write to the Free Software Foundation,
# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
#
# Correspondence concerning AIPS++ should be addressed as follows:
#        Internet email: aips2-request@nrao.edu.
#        Postal address: AIPS++ Project Office
#                        National Radio Astronomy Observatory
#                        520 Edgemont Road
#                        Charlottesville, VA 22903-2475 USA
#
# $Id: tablerow.py,v 1.6 2007/08/28 07:22:18 gvandiep Exp $

# Make interface to class TableRowProxy available.
from ._tables import TableRow

from .tablehelper import _check_key_slice


# A normal tablerow object keeps a reference to a table object to be able
# to know the actual number of rows.
# However, a mutual dependency is created when doing that for the tablerow
# object inside the table object.
# Therefore an intermediate _tablerow exists to be used in class table.

class _tablerow(TableRow):
    def __init__(self, table, columnnames, exclude=False):
        TableRow.__init__(self, table, columnnames, exclude)

    def iswritable(self):
        """Tell if all columns in the row object are writable."""
        return self._iswritable()

    def get(self, rownr):
        """Get the contents of the given row."""
        return self._get(rownr)

    def put(self, rownr, value, matchingfields=True):
        """Put the values into the given row.

        The value should be a dict (as returned by method :func:`get`.
        The names of the fields in the dict should match the names of the
        columns used in the `tablerow` object.

        `matchingfields=True` means that the value may contain more fields
        and only fields matching a column name will be used.

        """
        self._put(rownr, value, matchingfields)

    def _getitem(self, key, nrows):
        sei = _check_key_slice(key, nrows, 'tablerow')
        rownr = sei[0]
        if len(sei) == 1:
            return self.get(rownr)
        result = []
        inx = 0
        while inx < sei[1]:
            result.append(self.get(rownr))
            rownr += sei[2]
            inx += 1
        return result

    def _setitem(self, key, value, nrows):
        sei = _check_key_slice(key, nrows, 'tablerow')
        rownr = sei[0]
        if len(sei) == 1:
            return self.put(rownr, value)
        if isinstance(value, dict):
            # The same value is put in all rows.
            inx = 0
            while inx < sei[1]:
                self.put(rownr, value, True)
                rownr += sei[2]
                inx += 1
        else:
            # Each row has its own value.
            if len(value) != sei[1]:
                raise RuntimeError("tablerow slice length differs from value length")
            for val in value:
                self.put(rownr, val, True)
                rownr += sei[2]


class tablerow(_tablerow):
    """The Python interface to Casacore table rows.

    A table row is a record (dict) containing the values of a single row for
    one or more columns in a table. In constructing the `tablerow` object, one
    can specify which columns are to be included or excluded.
    By default all columns will be used, but if the table is writable,
    only writable columns will be used.

    A `tablerow` object can easily be constructed using :func:`table.row`.

    One or more rows can be read or written using the standard python indexing
    syntax where (negative) strides are possible.
    For example:

      t = table ('3c343.MS')
      tr = t.row (['ANTENNA1', 'ANTENNA2', 'ARRAY_ID'])
      tr[0]               # get row 0
      tr[:5]              # get row 0,1,2,3,4
      tr[-5,-1,]          # get last 4 rows
      tr[-1,-5,-1]        # get last 4 rows in reversed order
      tr[1] = tr[0]       # put values of row 0 into row 1

    Note that the last line will fail because the table is opened readonly.
    The argument `readonly=False` is needed in the table constructor to make
    it work.

    The `tablerow` class supports the context manager idiom (__enter__ and __exit__).
    When used in a `with` statement, the table changes will be flushed
    automatically, which is handy when writing to table rows.
    For example::

      with t.row() as tr:
        tr.put (1, tr.get(0))   # copy row 0 to row 1

    """

    def __init__(self, table, columnnames=[], exclude=False):
        _tablerow.__init__(self, table, columnnames, exclude)
        self._table = table

    def __enter__(self):
        """Function to enter a with block."""
        return self

    def __exit__(self, type, value, traceback):
        """Function to exit a with block which flushes the table object."""
        self._table.flush()

    def __len__(self):
        return self._table.nrows()

    def __getitem__(self, key):
        return self._getitem(key, self._table.nrows())

    def __setitem__(self, key, value):
        return self._setitem(key, value, self._table.nrows())