Different type while calling an instance
Question: I have following code:

    
    
    #
    
     def macierz(self, R, alfa, beta):
     #   '''Definiuje macierz przeksztalcenia.'''
     #   alfa=float(self.rad(alfa))
     #   beta=float(self.rad(beta))
     #   R=float(R)
     #   B=self.array([[-self.cos(alfa), -self.sin(alfa), 0, -R*self.cos(alfa)], [self.sin(alfa)*self.cos(beta), -self.cos(alfa)*self.cos(beta), -self.sin(beta), R*self.sin(alfa)*self.cos(beta)], [self.sin(alfa)*self.sin(beta), -self.cos(alfa)*self.sin(beta), self.cos(beta), R*self.sin(alfa)*self.cos(beta)], [0, 0, 0, 1]])
    
      def konwersja(self):
        '''Ta funkcja przeprowadza konwersje listy wsp wewnetrznych na wspolrzedne kartezjanskie.'''
        listaB=[]
        R=2
        alfa=1
        beta=1
        B=self.array([[-self.cos(alfa), -self.sin(alfa), 0, -R*self.cos(alfa)], [self.sin(alfa)*self.cos(beta), -self.cos(alfa)*self.cos(beta), -self.sin(beta), R*self.sin(alfa)*self.cos(beta)], [self.sin(alfa)*self.sin(beta), -self.cos(alfa)*self.sin(beta), self.cos(beta), R*self.sin(alfa)*self.cos(beta)], [0, 0, 0, 1]])
        lista_xyz=[]
        #matrix=self.macierz
        j=0
        q=self.array((0., 0., 0., 1.)).reshape(4,1)
        while j<len(self.lista):
        #  B=matrix(self.lista[j+1], self.lista[j+3], self.lista[j+5])
          q=self.dot(B, q)
          print self.lista[j], q[0,0], q[1,0], q[2,0]
          break
    

, which works fine, but when I change it to:

    
    
     def macierz(self, R, alfa, beta):
    
        '''Definiuje macierz przeksztalcenia.'''
        alfa=float(self.rad(alfa))
        beta=float(self.rad(beta))
        R=float(R)
        B=self.array([[-self.cos(alfa), -self.sin(alfa), 0, -R*self.cos(alfa)], [self.sin(alfa)*self.cos(beta), -self.cos(alfa)*self.cos(beta), -self.sin(beta), R*self.sin(alfa)*self.cos(beta)], [self.sin(alfa)*self.sin(beta), -self.cos(alfa)*self.sin(beta), self.cos(beta), R*self.sin(alfa)*self.cos(beta)], [0, 0, 0, 1]])
    
      def konwersja(self):
        '''Ta funkcja przeprowadza konwersje listy wsp wewnetrznych na wspolrzedne kartezjanskie.'''
        listaB=[]
        R=2
        alfa=1
        beta=1
        lista_xyz=[]
        matrix=self.macierz
        j=0
        q=self.array((0., 0., 0., 1.)).reshape(4,1)
        while j<len(self.lista):
          B=matrix(self.lista[j+1], self.lista[j+3], self.lista[j+5])
          q=self.dot(B, q)
          print self.lista[j], q[0,0], q[1,0], q[2,0]
          break
    

I get:

    
    
    File "./zmat_xyz.py", line 37, in konwersja
        q=self.dot(B, q)
    TypeError: unsupported operand type(s) for *: 'NoneType' and 'float'
    

Why, when I call the `macierz` function type is not recognised?

Okay, I think that what I wrote above is quite confusing. Here is a full code:

    
    
    #!/usr/bin/python
    class Internal:
      from numpy import sin, cos, radians, array, pi, dot, zeros, reshape
      rad=radians
      lista=[]
      i=0
      def dane(self, plik_zmat):
        '''Ta funkcja przygotowuje plik zmat, typu MOPAC do odczytu przez funkcje konwersja.'''
        plik=open(plik_zmat, 'r+')
        for linijka in plik:
          for slowo in linijka.split():
            try:
              slowo=float(slowo)
            except ValueError:
              pass
            self.lista.append(slowo)
        while self.i<6:
          self.lista.pop(0)
          self.i+=1
    
     # def macierz(self, R, alfa, beta):
     #   '''Definiuje macierz przeksztalcenia.'''
     #   alfa=float(self.rad(alfa))
     #   beta=float(self.rad(beta))
     #   R=float(R)
     #   B=self.array([[-self.cos(alfa), -self.sin(alfa), 0, -R*self.cos(alfa)], [self.sin(alfa)*self.cos(beta), -self.cos(alfa)*self.cos(beta), -self.sin(beta), R*self.sin(alfa)*self.cos(beta)], [self.sin(alfa)*self.sin(beta), -self.cos(alfa)*self.sin(beta), self.cos(beta), R*self.sin(alfa)*self.cos(beta)], [0, 0, 0, 1]])
    
      def konwersja(self):
        '''Ta funkcja przeprowadza konwersje listy wsp wewnetrznych na wspolrzedne kartezjanskie.'''
        listaB=[]
        R=2
        alfa=1
        beta=1
        B=self.array([[-self.cos(alfa), -self.sin(alfa), 0, -R*self.cos(alfa)], [self.sin(alfa)*self.cos(beta), -self.cos(alfa)*self.cos(beta), -self.sin(beta), R*self.sin(alfa)*self.cos(beta)], [self.sin(alfa)*self.sin(beta), -self.cos(alfa)*self.sin(beta), self.cos(beta), R*self.sin(alfa)*self.cos(beta)], [0, 0, 0, 1]])
        lista_xyz=[]
        #matrix=self.macierz 
        j=0
        q=self.array((0., 0., 0., 1.)).reshape(4,1)
        while j<len(self.lista):
        #  B=matrix(self.lista[j+1], self.lista[j+3], self.lista[j+5])
          q=self.dot(B, q)
          print self.lista[j], q[0,0], q[1,0], q[2,0]
          break
    
    Internal().dane('formaldehyd.zmat')
    print Internal().lista
    Internal().konwersja()
    


Answer: You don't have any `return` statements in your `macierz` function. This causes
Python to return an implicit `None`. Which you notice in the error.

Change the following line:

`B=self.array([[-self.cos(alfa), -self.sin(alfa), 0, -R*self.cos(alfa)],
[self.sin(alfa)*self.cos(beta), -self.cos(alfa)*self.cos(beta),
-self.sin(beta), R*self.sin(alfa)*self.cos(beta)],
[self.sin(alfa)*self.sin(beta), -self.cos(alfa)*self.sin(beta),
self.cos(beta), R*self.sin(alfa)*self.cos(beta)], [0, 0, 0, 1]])`

to:

`return self.array([[-self.cos(alfa), -self.sin(alfa), 0, -R*self.cos(alfa)],
[self.sin(alfa)*self.cos(beta), -self.cos(alfa)*self.cos(beta),
-self.sin(beta), R*self.sin(alfa)*self.cos(beta)],
[self.sin(alfa)*self.sin(beta), -self.cos(alfa)*self.sin(beta),
self.cos(beta), R*self.sin(alfa)*self.cos(beta)], [0, 0, 0, 1]])`

This will return the array created and be assigned to your `B` name in
`konwersja`.

