# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
import collections
from cython cimport binding
cdef class Scalar(_Weakrefable):
"""
The base class for scalars.
"""
def __init__(self):
raise TypeError("Do not call {}'s constructor directly, use "
"pa.scalar() instead.".format(self.__class__.__name__))
cdef void init(self, const shared_ptr[CScalar]& wrapped):
self.wrapped = wrapped
@staticmethod
cdef wrap(const shared_ptr[CScalar]& wrapped):
cdef:
Scalar self
Type type_id = wrapped.get().type.get().id()
shared_ptr[CDataType] sp_data_type = wrapped.get().type
if type_id == _Type_NA:
return _NULL
if type_id not in _scalar_classes:
raise NotImplementedError(
"Wrapping scalar of type " + frombytes(sp_data_type.get().ToString()))
typ = get_scalar_class_from_type(sp_data_type)
self = typ.__new__(typ)
self.init(wrapped)
return self
cdef inline shared_ptr[CScalar] unwrap(self) nogil:
return self.wrapped
@property
def type(self):
"""
Data type of the Scalar object.
"""
return pyarrow_wrap_data_type(self.wrapped.get().type)
@property
def is_valid(self):
"""
Holds a valid (non-null) value.
"""
return self.wrapped.get().is_valid
def cast(self, object target_type=None, safe=None, options=None, memory_pool=None):
"""
Cast scalar value to another data type.
See :func:`pyarrow.compute.cast` for usage.
Parameters
----------
target_type : DataType, default None
Type to cast scalar to.
safe : boolean, default True
Whether to check for conversion errors such as overflow.
options : CastOptions, default None
Additional checks pass by CastOptions
memory_pool : MemoryPool, optional
memory pool to use for allocations during function execution.
Returns
-------
scalar : A Scalar of the given target data type.
"""
return _pc().cast(self, target_type, safe=safe,
options=options, memory_pool=memory_pool)
def validate(self, *, full=False):
"""
Perform validation checks. An exception is raised if validation fails.
By default only cheap validation checks are run. Pass `full=True`
for thorough validation checks (potentially O(n)).
Parameters
----------
full : bool, default False
If True, run expensive checks, otherwise cheap checks only.
Raises
------
ArrowInvalid
"""
if full:
with nogil:
check_status(self.wrapped.get().ValidateFull())
else:
with nogil:
check_status(self.wrapped.get().Validate())
def __repr__(self):
return '<pyarrow.{}: {!r}>'.format(
self.__class__.__name__, self.as_py()
)
def __str__(self):
return str(self.as_py())
def equals(self, Scalar other not None):
"""
Parameters
----------
other : pyarrow.Scalar
Returns
-------
bool
"""
return self.wrapped.get().Equals(other.unwrap().get()[0])
def __eq__(self, other):
try:
return self.equals(other)
except TypeError:
return NotImplemented
def __hash__(self):
cdef CScalarHash hasher
return hasher(self.wrapped)
def __reduce__(self):
return scalar, (self.as_py(), self.type)
def as_py(self):
raise NotImplementedError()
_NULL = NA = None
cdef class NullScalar(Scalar):
"""
Concrete class for null scalars.
"""
def __cinit__(self):
global NA
if NA is not None:
raise RuntimeError('Cannot create multiple NullScalar instances')
self.init(shared_ptr[CScalar](new CNullScalar()))
def __init__(self):
pass
def as_py(self):
"""
Return this value as a Python None.
"""
return None
_NULL = NA = NullScalar()
cdef class BooleanScalar(Scalar):
"""
Concrete class for boolean scalars.
"""
def as_py(self):
"""
Return this value as a Python bool.
"""
cdef CBooleanScalar* sp = <CBooleanScalar*> self.wrapped.get()
return sp.value if sp.is_valid else None
cdef class UInt8Scalar(Scalar):
"""
Concrete class for uint8 scalars.
"""
def as_py(self):
"""
Return this value as a Python int.
"""
cdef CUInt8Scalar* sp = <CUInt8Scalar*> self.wrapped.get()
return sp.value if sp.is_valid else None
cdef class Int8Scalar(Scalar):
"""
Concrete class for int8 scalars.
"""
def as_py(self):
"""
Return this value as a Python int.
"""
cdef CInt8Scalar* sp = <CInt8Scalar*> self.wrapped.get()
return sp.value if sp.is_valid else None
cdef class UInt16Scalar(Scalar):
"""
Concrete class for uint16 scalars.
"""
def as_py(self):
"""
Return this value as a Python int.
"""
cdef CUInt16Scalar* sp = <CUInt16Scalar*> self.wrapped.get()
return sp.value if sp.is_valid else None
cdef class Int16Scalar(Scalar):
"""
Concrete class for int16 scalars.
"""
def as_py(self):
"""
Return this value as a Python int.
"""
cdef CInt16Scalar* sp = <CInt16Scalar*> self.wrapped.get()
return sp.value if sp.is_valid else None
cdef class UInt32Scalar(Scalar):
"""
Concrete class for uint32 scalars.
"""
def as_py(self):
"""
Return this value as a Python int.
"""
cdef CUInt32Scalar* sp = <CUInt32Scalar*> self.wrapped.get()
return sp.value if sp.is_valid else None
cdef class Int32Scalar(Scalar):
"""
Concrete class for int32 scalars.
"""
def as_py(self):
"""
Return this value as a Python int.
"""
cdef CInt32Scalar* sp = <CInt32Scalar*> self.wrapped.get()
return sp.value if sp.is_valid else None
cdef class UInt64Scalar(Scalar):
"""
Concrete class for uint64 scalars.
"""
def as_py(self):
"""
Return this value as a Python int.
"""
cdef CUInt64Scalar* sp = <CUInt64Scalar*> self.wrapped.get()
return sp.value if sp.is_valid else None
cdef class Int64Scalar(Scalar):
"""
Concrete class for int64 scalars.
"""
def as_py(self):
"""
Return this value as a Python int.
"""
cdef CInt64Scalar* sp = <CInt64Scalar*> self.wrapped.get()
return sp.value if sp.is_valid else None
cdef class HalfFloatScalar(Scalar):
"""
Concrete class for float scalars.
"""
def as_py(self):
"""
Return this value as a Python float.
"""
cdef CHalfFloatScalar* sp = <CHalfFloatScalar*> self.wrapped.get()
return PyHalf_FromHalf(sp.value) if sp.is_valid else None
cdef class FloatScalar(Scalar):
"""
Concrete class for float scalars.
"""
def as_py(self):
"""
Return this value as a Python float.
"""
cdef CFloatScalar* sp = <CFloatScalar*> self.wrapped.get()
return sp.value if sp.is_valid else None
cdef class DoubleScalar(Scalar):
"""
Concrete class for double scalars.
"""
def as_py(self):
"""
Return this value as a Python float.
"""
cdef CDoubleScalar* sp = <CDoubleScalar*> self.wrapped.get()
return sp.value if sp.is_valid else None
cdef class Decimal128Scalar(Scalar):
"""
Concrete class for decimal128 scalars.
"""
def as_py(self):
"""
Return this value as a Python Decimal.
Loading ...