2017-02-26 1 views
1

ich die Troposphäre Bibliothek bin mit und ich versuche, zwei String-Objekte zu kombinieren, die Join haben:Python Troposphäre: Wie kombinieren zwei Strings Join enthält

from troposphere import Join 

str1 = Join('', [""" 
sed -i -e '/hostname/s/=.*/=example.com/' /tmp/file.app 
\n"""]) 

und

str2 = Join('', [""" 
sed -i -e '/IP/s/=.*/=192.168.100.100/' /tmp/file.app 
\n"""]) 

I habe versucht, sie zu kombinieren mit:

str3 = str1 + str2 
and 
str1 += str2 

Aber leider wird folgende Fehler ich erhalte:

TypeError: unsupported operand type(s) for +: 'Join' and 'Join' 
+1

Soll das 'Join' oder' join' sein? Wenn es 'Join' ist, erwähnen Sie bitte die Bibliothek, von der es kommt. –

+0

von troposphere import Join, ich habe die Frage aktualisiert leider – BigBoss

+0

Warum verwenden Sie nicht str.join ([]) statt? –

Antwort

2

Verwenden String-Verkettung vor Join:

Sie könnten nur String-Verkettung gelten vor dem Erstellen von Joins:

from troposphere import Join 

str1 = """ 
sed -i -e '/hostname/s/=.*/=example.com/' /tmp/file.app 
\n""" 

str2 = """ 
sed -i -e '/IP/s/=.*/=192.168.100.100/' /tmp/file.app 
\n""" 

str3 = str1.strip()+str2 

join1, join2, join3 = [Join('', [cmd]) for cmd in (str1, str2, str3)] 

print join3.data 
# {'Fn::Join': ['', ["sed -i -e '/hostname/s/=.*/=example.com/' /tmp/file.app\nsed -i -e '/IP/s/=.*/=192.168.100.100/' /tmp/file.app\n\n"]]} 

Join definieren zusätzlich:

Hier ist die Definition von Join Klasse ist:

class Join(AWSHelperFn): 
    def __init__(self, delimiter, values): 
     validate_delimiter(delimiter) 
     self.data = {'Fn::Join': [delimiter, values]} 

Um join_a + join_b zu definieren, könnten Sie verwenden:

from troposphere import Join 


def add_joins(join_a, join_b): 
    delimiter = join_a.data['Fn::Join'][0] 
    str_a = join_a.data['Fn::Join'][1][0] 
    str_b = join_b.data['Fn::Join'][1][0] 

    return Join(delimiter, [str_a.strip() + str_b]) 

Join.__add__ = add_joins 

str1 = """ 
sed -i -e '/hostname/s/=.*/=example.com/' /tmp/file.app 
\n""" 

str2 = """ 
sed -i -e '/IP/s/=.*/=192.168.100.100/' /tmp/file.app 
\n""" 

join1 = Join('', [str1]) 
join2 = Join('', [str2]) 

print (join1 + join2).data 
# {'Fn::Join': ['', ["sed -i -e '/hostname/s/=.*/=example.com/' /tmp/file.app\nsed -i -e '/IP/s/=.*/=192.168.100.100/' /tmp/file.app\n\n"]]} 
+0

Ich bin mir nicht sicher, ob er eine Änderung an der Bibliothek vornehmen kann. –

+0

@PaulRooney: Wahr. Ich habe den Code aktualisiert. Ist es jetzt besser? –

+0

Ich habe keine Ahnung, was die Antwort ist. Wenn es funktioniert, sollte es in Ordnung sein. –

Verwandte Themen