Python astropy.io.fits-层次关键词don';t使用“继续”卡:错误或“继续”;特写“;符合标准吗?

Python astropy.io.fits-层次关键词don';t使用“继续”卡:错误或“继续”;特写“;符合标准吗?,python,fits,astropy,pyfits,Python,Fits,Astropy,Pyfits,astropy.io.fitsmanual声明,我们可以使用长度超过8个字符的标题关键字。在这种情况下。手册还指出,如果我们想要存储超过80个字符的关键字-值对 然而,在实践中,这两个定义似乎只是相互排斥的,即我们无法创建包含关键字-值对的FITS文件,其中关键字长度超过8个字符(即层次关键字),且值是非常长的字符串 例如: from astropy.io import fits header1 = fits.Header() header2 = fits.Header() header3 =

astropy.io.fits
manual声明,我们可以使用长度超过8个字符的标题关键字。在这种情况下。手册还指出,如果我们想要存储超过80个字符的关键字-值对

然而,在实践中,这两个定义似乎只是相互排斥的,即我们无法创建包含关键字-值对的FITS文件,其中关键字长度超过8个字符(即层次关键字),且值是非常长的字符串

例如:

from astropy.io import fits

header1 = fits.Header()
header2 = fits.Header()
header3 = fits.Header()

header1['TEST'] = 'superlongstring'*10
header2['TEST TEST'] = 'superlongstring'
header3['TEST TEST'] = 'superlongstring'*10
这里的
header1
header2
是正确的,但是当调用
repr(header3)
或试图用这样的头保存FITS文件时,会出现错误
ValueError:关键字TEST及其值太长

这是否是FITS标准的“意外功能”,即
HIERARCH
关键字不能用
CONTINUE
卡继续,或者这可能仅仅是
astropy.io.FITS
的一个bug?

以下部分答案由熟悉astropy代码库的同事提供

查看
astropy
源代码,明确排除在属于HIERARCH关键字的值中使用CONTINUE卡

在源代码中,我们发现():

该评论来自2011年,是在pyfits重新设计期间发表的。在此之前,pyfits还可以单独阅读或书写等级卡或带有CONTINUE语句的卡,显然它是这样保存的。有关:

然而,根据我的感觉,没有什么特别的理由让等级制度将长期价值排除在继续之外

到目前为止,我的同事给出了答案,他最后建议在astropy问题跟踪器中创建一张罚单

我也做了一些研究 我自己HIERARCH和CONTINUE关键字都不是 官员。HIERARCH关键字约定是 屈服于 而CONTINUE公约是由。仔细阅读这两个定义,我认为绝对没有理由认为它们应该相互排斥。因此,我创建了一个

编辑: 正如iGuanaut在回答中所提到的,似乎有一个原因表明它们确实是互斥的,即等级卡在形式上根本不包含任何值。。。疯狂但真实,因此我认为我的答案是不正确的。

我在中写道,但我在这里也复制了一个版本作为可能的答案:

这里的问题是CONTINUE约定严格限于扩展具有字符串值的卡的值(即,它不适用于具有不同类型值的卡)。但是,从形式上讲,使用HIERARCH约定的卡根本没有任何价值,因此CONTINUE约定不适用于它,除非在使用HIERARCH约定解析卡时隐式支持CONTINUE约定。因为在如何做到这一点上存在歧义(例如,关键字的最大长度是多少?),并且因为等级惯例没有明确允许这种解释(它为如何解释等级卡的内容提供了一套具体的指导原则)FITS读者应避免对某些未记录的层次卡解释添加任何隐含支持(从而建立另一种大多数读者/作者不支持的隐含约定)


我们可以做的是游说ESO HIERARCH约定的作者更新他们的约定,以明确与CONTINUE约定的相互兼容性,在任何支持这两种约定的FITS阅读器中都应该允许这样做。但与此同时,这一问题也充满了困难,即使“显然”他们可以合作。

Feature。这两个约定互不兼容。响应延迟,部分不直接相关,但是,在astropy的标记中不添加这个难看的“HIERARCH”关键字,是否可以使用>8个字符的键?(为了特定用例的目的,而不是与学术人士共享)?@Tobbey否,FITS标准(astropy遵守)明确规定了这一点
keywordvalue_length = len(keyword) + len(delimiter) + len(value)
if (keywordvalue_length > self.length and
        keyword.startswith('HIERARCH')):
    if (keywordvalue_length == self.length + 1 and keyword[-1] == ' '):
        output = ''.join([keyword[:-1], delimiter, value, comment])
    else:
        # I guess the HIERARCH card spec is incompatible with CONTINUE
        # cards
        raise ValueError('The keyword %s with its value is too long' %
                         self.keyword)
if cardimage[:8].upper() == 'HIERARCH':
    card = _HierarchCard()
    # for card image longer than 80, assume it contains CONTINUE card(s).
elif len(cardimage) > Card.length:
    card = _ContinueCard()