簡體   English   中英

TypeError:'bool'類型的對象沒有len()-Odoo v9社區

[英]TypeError: object of type 'bool' has no len() - Odoo v9 community

我在代碼的另一部分上仍然存在此錯誤:

class invoice(models.Model):
_inherit = "account.invoice"

@api.multi
def send_xml_file(self):
    # haciendolo para efacturadelsur solamente por ahora
    host = 'https://www.efacturadelsur.cl'
    post = '/ws/DTE.asmx' # HTTP/1.1
    url = host + post
    _logger.info('URL to be used %s' % url)
    # client = Client(url)
    # _logger.info(client)
    _logger.info('len (como viene): %s' % len(self.sii_xml_request))

    response = pool.urlopen('POST', url, headers={
        'Content-Type': 'application/soap+xml',
        'charset': 'utf-8',
        'Content-Length': len(
            self.sii_xml_request)}, body=self.sii_xml_request)

    _logger.info(response.status)
    _logger.info(response.data)
    self.sii_xml_response = response.data
    self.sii_result = 'Enviado'

在我之前的問題中,此行的錯誤已解決:

_logger.info('len (como viene): %s' % (len(self.sii_xml_request) if self.sii_xml_request else '')

現在,我在下一個中再次使用它,我已經嘗試過像以前一樣的條件,但是我仍然不能解決它,它必須與語法或某些東西相關,錯誤在於這句話:

        response = pool.urlopen('POST', url, headers={
        'Content-Type': 'application/soap+xml',
        'charset': 'utf-8',
        'Content-Length': len(
            self.sii_xml_request)}, body=self.sii_xml_request)

特別是在self.sii_xml_request)}, body=self.sii_xml_request)再次有sii_xml_request對象,我認為這只是添加條件的問題,因為該字段為空...

但是我仍然無法使其正常工作,這是否可以通過與上一個問題類似的方式解決?

提前致謝!

編輯

它不是重復的,因為這是另一行代碼,並且解決此問題的方法非常相似,此處略有不同,這是不重復的。

第二編輯

這就是現在的樣子,該函數的每個len都有條件

@api.multi
def send_xml_file(self):
    # haciendolo para efacturadelsur solamente por ahora
    host = 'https://www.efacturadelsur.cl'
    post = '/ws/DTE.asmx' # HTTP/1.1
    url = host + post
    _logger.info('URL to be used %s' % url)
    # client = Client(url)
    # _logger.info(client)
    _logger.info('len (como viene): %s' % len(self.sii_xml_request)if self.sii_xml_request else '')
    #if self.sii_xml_request:
    response = pool.urlopen('POST', url, headers={
        'Content-Type': 'application/soap+xml',
        'charset': 'utf-8',
        'Content-Length': (len(
            self.sii_xml_request) if self.sii_xml_request else '')}, body=self.sii_xml_request)
    #else ''(len(self.sii_xml_request) if self.sii_xml_request else '') 

    _logger.info(response.status)
    _logger.info(response.data)
    self.sii_xml_response = response.data
    self.sii_result = 'Enviado'

為了避免拖累評論中的對話,我將對實際答案進行細化。

看來您的對象self.sii_xml_request可以是a)。 字符串,或b)。 一個布爾值( TrueFalse )(但是如果我錯了,請更正我)。

您會收到一個錯誤消息,因為您正試圖使用​​該對象的len()來了解請求的長度,但是當該對象為TrueFalse時,它將失敗,因為bool對象沒有__len__屬性。 您嘗試通過執行以下操作來基於上一個問題解決此問題:

(len(self.sii_xml_request) if self.sii_xml_request else '')

僅當self.sii_xml_request僅返回字符串或False (或等同於FalseNone0[]等)時,此方法才有效,因為如果返回True ,則它將再次嘗試獲取len()無效的對象。

正在做:

(len(self.sii_xml_request) if self.sii_xml_request is not True or False else '')

可能可行,但是我不知道是什么決定self.sii_xml_request返回TrueFalse還是某個字符串,因此您可能希望以不同的方式處理TrueFalse 另外,您可能永遠都不希望內容長度為''因為它通常是整數,因此如果self.sii_xml_requestFalse ,則任何內容都應為0 如果您要同樣處理它們,請嘗試上面的內容。 否則,您可以更早定義變量content_length ,然后根據self.sii_xml_request的值進行self.sii_xml_request 例如:

if isinstance(self.sii_xml_request, bool):
    content_lengthj == int(self.sii_xml_request)  # 1 if True else 0
else:
    content_length = len(self.sii_xml_request)

...
response = pool.urlopen('POST', url, headers={
        'Content-Type': 'application/soap+xml',
        'charset': 'utf-8',
        'Content-Length': content_length}, body=self.sii_xml_request)

當消息中出現“ bool”時出現這種錯誤,這意味着您在一個空字段上調用了一個函數,因此在調用任何函數之前,請先檢查該字段是否具有值。 因為在odoo中,空字段包含False值不是None我每次發現我在空字段上調用函數時,都會多次遇到此錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM